我正在尝试创建一个TextField矩阵,以计算该矩阵的特征值和-vectors,根据用户输入的大小在2-5之间。最后,我使用ForEach循环进行创建,但在找到this solution之前仍然存在保存输入值的问题。但这给我留下了三个主要缺点:
Binding(get: set:)是如何工作的,也没有找到任何有用的文档。但是不知怎么的,它在设置值方面速度如此之快,以至于:时也是如此。
append任何校正尝试都会使数据混乱。
所有的尝试都是关于使用外部矩阵结构,或者2D-Array,当涉及到与文本绑定的链接时,给我留下空白。因此,就代码而言,我被我的总体规划布局、选择器和非最佳解决方案困住了:
import SwiftUI
struct Eigen: View {
@State private var dimension = 3
@State var matrixVals = [Double]()
var body: some View {
Text("Eigenwerte und Vektoren")
.font(.largeTitle)
NavigationView{
VStack{
Spacer()
Text("Bitte Matrix Größe wählen: ")
Picker(selection: $dimension, label: Text("Dimension")) {
Text("2x2").tag(2)
Text("3x3").tag(3)
Text("4x4").tag(4)
Text("5x5").tag(5)
}.frame(maxWidth:150)
HStack{
ForEach(0..<dimension, id:\.self) { row in
VStack {
ForEach(0..<dimension, id:\.self) {column in
TextField("", text: Binding(
get: { if matrixVals.count > column*dimension + row { return String(matrixVals[column*dimension + row]) } else { return "" }},
set: { (newValue) in return self.matrixVals.append(Double(newValue) ?? 1.0) }
)).frame(maxWidth: 40, alignment: .center)
}
}
}
}
Spacer()
Button("Aktualisieren", action: Auswertung)
}
}
}
func Auswertung(){
for i in matrixVals{
print("\(i)")
}
}
}从这里走最好的方法是什么?任何帮助都是非常感谢的。提前感谢!
发布于 2021-07-27 11:01:06
Binding对于getter和setter来说是相当简单的结构,视图可能会根据实现的不同而使用它。
苹果(TextField)(几乎所有的苹果浏览量)称:
每次
get视图在任何文本更改后都是rebuiltset。在你的情况下会发生什么:
1并添加到数组中,因为它是一个@State --它触发视图重新加载,textfield调用get,然后将1转换为"1.0“(双字符的默认字符串表示形式)--输入第二个字符,将其附加到当前字符串("1.0”+“1”)中,从而将"1.01“添加到set中,然后将其附加到数组中,如果尝试删除"1.0“中的最后一个字符,set将得到”1“,则它将成为第二项1,然后再转换为字符串"1.0"因此,在您的set中,您希望更新数组的值,而不是附加值。可能是用空字符串来填充,这样它们就可以按任何顺序编辑。
另外,我建议您将值存储为字符串,这样在转换它们时就不会有问题,如果字符串不能转换为double(或者禁用按钮),可以将文本颜色更改为红色。
struct Eigen: View {
@State private var dimension = 3
@State var matrixVals = [String](repeating: "", count: 9)
var body: some View {
Text("Eigenwerte und Vektoren")
.font(.largeTitle)
NavigationView{
VStack{
Spacer()
Text("Bitte Matrix Größe wählen: ")
Picker(selection: $dimension, label: Text("Dimension")) {
Text("2x2").tag(2)
Text("3x3").tag(3)
Text("4x4").tag(4)
Text("5x5").tag(5)
}.frame(maxWidth:150)
.onChange(of: dimension) { dimension in
// add new empties if new dimension is bigger then prev
let extraValues = dimension * dimension - matrixVals.count
if extraValues > 0 {
matrixVals.append(.init(repeating: "", count: extraValues))
}
}
HStack{
ForEach(0..<dimension, id:\.self) { row in
VStack {
ForEach(0..<dimension, id:\.self) {column in
let index = column*dimension + row
TextField("title", text: Binding(
get: { matrixVals[index] },
set: { newValue in
self.matrixVals[index] = newValue
}
)).frame(maxWidth: 40, alignment: .center)
.foregroundColor(Double(matrixVals[index]) != nil ? .black : .red)
}
}
}
}
Spacer()
Button("Aktualisieren", action: Auswertung)
}
}
}
func Auswertung(){
for i in matrixVals{
print("\(i)")
}
}
}https://stackoverflow.com/questions/68543046
复制相似问题