在 SwiftUI 的 Picker 中添加新元素

Posted

技术标签:

【中文标题】在 SwiftUI 的 Picker 中添加新元素【英文标题】:Add new Element in Picker in SwiftUI 【发布时间】:2019-09-17 05:22:24 【问题描述】:

我找不到如何在 SwiftUI 的选取器视图中添加一些元素,在我的示例中,我想在单击按钮时在选取器中添加“Z”值。

struct ContentView: View 
@State var values: [String] = ["A", "B", "C"]

@State private var selectedValue = 0

var body: some View 
    NavigationView 
        Form 
            Section 
                Picker(selection: $selectedValue, label: Text("Value")) 
                    ForEach(0 ..< values.count) 
                        Text(self.values[$0])

                    
                
            
            Button(action: 
        self.values.append("Z")
            , label: 
                Text("Add")
            )
        .navigationBarTitle("Select a value")

    

当我点击按钮时,Z 被添加到“values”数组中,但 Picker 没有刷新。

谢谢你:)

【问题讨论】:

【参考方案1】:

您必须通过 id 识别 SwiftUI 的值,以使其更改可检测:

ForEach(0 ..< self.values.count, id: \.self) 
    Text(self.values[$0])

这样 SwiftIU 知道它应该在更改时重建选择器。

提示:您可以像这样直接使用元素:

ForEach(values, id: \.self) 
    Text($0)

不要忘记更改 selectedValue 类型和值以匹配您按照上述提示操作的数据源 IF

@State private var selectedValue = "A"

【讨论】:

我试过你的提示,但 selectedValue 没有更新? 那么你应该改变selectedValue的类型和值来匹配数据源。答案已更新。 啊哈,这是逻辑,谢谢。【参考方案2】:

将 selectedValue 从 int 更改为 String

@State private var selectedValue = "A"

添加参数id和标签修饰符

Picker(selection: $selectedValue, label: Text("Value")) 
    ForEach(values, id: \.self) 
        Text($0).tag(String($0))
    

【讨论】:

以上是关于在 SwiftUI 的 Picker 中添加新元素的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI Segmented Picker 元素为灰色且禁用

如何在没有额外空间的情况下更改 SwiftUI Picker 视图大小?

SwiftUI Picker 在同一视图中更改第二个状态变量

向 SwiftUI Picker 添加回调

SwiftUI:将动画添加到 Picker 而不将其添加到值中

在 SwiftUI Picker 中为 NSManagedObject 设置默认值?