首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建和链接Textfield的矩阵

如何创建和链接Textfield的矩阵
EN

Stack Overflow用户
提问于 2021-07-27 10:14:44
回答 1查看 36关注 0票数 0

我正在尝试创建一个TextField矩阵,以计算该矩阵的特征值和-vectors,根据用户输入的大小在2-5之间。最后,我使用ForEach循环进行创建,但在找到this solution之前仍然存在保存输入值的问题。但这给我留下了三个主要缺点:

  1. 我真的不明白Binding(get: set:)是如何工作的,也没有找到任何有用的文档。但是不知怎么的,它在设置值方面速度如此之快,以至于:

  1. I不能输入多于一个数字的数字,即使在删除默认值以支持强制展开和

时也是如此。

  1. 因此出现了纯append任何校正尝试都会使数据

混乱。

所有的尝试都是关于使用外部矩阵结构,或者2D-Array,当涉及到与文本绑定的链接时,给我留下空白。因此,就代码而言,我被我的总体规划布局、选择器和非最佳解决方案困住了:

代码语言:javascript
复制
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)")
        }
    }
}

从这里走最好的方法是什么?任何帮助都是非常感谢的。提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-27 11:01:06

Binding对于getter和setter来说是相当简单的结构,视图可能会根据实现的不同而使用它。

苹果(TextField)(几乎所有的苹果浏览量)称:

每次

  1. get视图在任何文本更改后都是rebuilt
  2. set

在你的情况下会发生什么:

  1. 您输入第一个字符(例如"1"),它被转换为双1并添加到数组中,因为它是一个@State --它触发视图重新加载,textfield调用get,然后将1转换为"1.0“(双字符的默认字符串表示形式)--输入第二个字符,将其附加到当前字符串("1.0”+“1”)中,从而将"1.01“添加到set中,然后将其附加到数组中,如果尝试删除"1.0“中的最后一个字符,set将得到”1“,则它将成为第二项
  2. 。,将其转换为双1,然后再转换为字符串"1.0"

因此,在您的set中,您希望更新数组的值,而不是附加值。可能是用空字符串来填充,这样它们就可以按任何顺序编辑。

另外,我建议您将值存储为字符串,这样在转换它们时就不会有问题,如果字符串不能转换为double(或者禁用按钮),可以将文本颜色更改为红色。

代码语言:javascript
复制
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)")
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68543046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档