文字无法根据选择器正确更新

时间:2020-08-09 19:14:52

标签: ios swift swiftui picker

这是我的模特

struct ListItemModel: Codable, Identifiable {
   let id: String  
   let name: String
}

这是将与选择器一起显示的视图。该列表将由外部来源填充,但在此示例中,我对其进行了简化。

struct TypeSelectionView: View {
    @State private var selected = 0
    
    let testList = [ListItemModel(id: "11", name: "name1"),
                        ListItemModel(id: "12", name: "name2")]
    
    var body: some View {
        VStack {
            Picker(selection: $selected, label: Text("Pick a Type")) {
                    ForEach(0 ..< testList.count) {
                        Text(testList[$0].name)
                    }
            }.labelsHidden()
            
            Picker(selection: $selected, label: Text("Pick a Type")) {
                    ForEach(testList) {type in
                        Text(type.name)
                }
            }.labelsHidden()
            
            Text("Selected Type: \(testList[selected].name)")
            
            Spacer()
        }
    }
}



struct TypeSelectionView_Previews: PreviewProvider {
    static var previews: some View {
        TypeSelectionView()
    }
}

在第一选择器被正确地改变文字的页面上的显示时,选择器变化,但所述第二选择器没有。他们是否可以让第二个Picker做同样的事情,因为当您更改Picker时,Text视图将相应地更新 还是在SwiftUI中制作Pickers时应该一直使用的第一个Picker?

2 个答案:

答案 0 :(得分:1)

第二个void MainWindow::paintEvent(QPaintEvent *event){ Q_UNUSED(event); QRadialGradient grad(QPoint(this->width()/2,this->height()/2) , 50); grad.setSpread(QGradient::RepeatSpread); grad.setColorAt(0 , QColor(0,0,0)); grad.setColorAt(1 , QColor(100,100,100)); QPainter paint(this); paint.setRenderHint(QPainter::Antialiasing , true); QRectF r1(0,0,this->width(),this->height()); paint.drawRect(r1); QBrush brush(grad); paint.fillRect(r1 , brush); ... ... } 不起作用的原因是Picker返回的值对应于项目的Picker。对于第二个id,它们是Picker

您可以将String应用于每个项目,然后.tag()将返回该值。例如,如果您添加了一个明确的Picker,它将可以正常工作:

tag

或者,如果将Text(type.name).tag(testList.firstIndex(where: { $0.id == type.id })!) 的值更改为id,并且Int的值与数组中的位置相对应,那么它将起作用。

由于实现id的困难,很容易看出为什么许多开发人员选择仅迭代tag

答案 1 :(得分:0)

好吧,这是我对堆栈溢出问题的第一个答案,我本人还是一个新手,但希望我能有所帮助。

该代码放入Xcode时会显示两个选择器,其初始值为name1,但是当您更改第一个选择器时,第二个选择器和显示所选类型的文本会相应更改,但是因为两个选择器共享相同的源@State private var selected = 0,更改此设置将产生意想不到的副作用。

import SwiftUI

struct TypeSelectionView: View {
    @State private var selected = 0
    

    @State var testList = [ListItemModel(id: "11", name: "name1"),
        ListItemModel(id: "12", name: "name2")]
    @State var priorityTypes = ["low", "medium", "high", "critical"]

    var body: some View {
        VStack {
            Picker("Pick a Type", selection: $selected) {
                ForEach(0..<testList.count) {
                    Text(self.testList[$0].name)
                }
            }.labelsHidden()

           Picker("Pick a Type", selection: $selected) {
               ForEach(0..<testList.count) {
                   Text(self.testList[$0].name)
               }
           }.labelsHidden()

            Text("Selected Type: \(testList[selected].name)")

            Spacer()
        }
    }
}



struct TypeSelectionView_Previews: PreviewProvider {
    static var previews: some View {
        TypeSelectionView()
    }
}

struct ListItemModel: Codable, Identifiable {
    let id: String
    let name: String
}