在SwiftUI中,标签(tag)的作用是什么?

10

我对标签的作用感到困惑。 当我删除标签时,我只能选择"M",添加标签后,我可以选择所有选项。

当我创建整数数组选择器时,标签的存在并不重要。

但在字符串数组中会出现问题。 我想知道为什么会发生这些事情。

import SwiftUI

struct InitGender: View {
    @ObservedObject var initData : InitData
    @ObservedObject var initViewRouter : InitViewRouter
    let genderRange = ["M","F"]
    
    var body: some View {
        VStack {
            Text("Select your gender")
                .font(.title)
                .bold()
            
            Picker("Select gender", selection : $initData.gender) {
                ForEach(0..<genderRange.count) {
                    Text(self.genderRange[$0]).tag(self.genderRange[$0])
                }
            }
            .labelsHidden()
            .clipped()
        }
    }    
}
1个回答

12

SwiftUI Picker 通过tagid检测选择,对于这种类型的选择,tag(或id)必须相同。

这是一个演示(经过Xcode 12 / iOS 14测试)

struct InitGender: View {
    @State private var selection: String = "M"
    let genderRange = ["M","F"]

    var body: some View {
        VStack {
            Text("Select your gender")
                .font(.title)
                .bold()
            Text("Selected: \(selection)")

            Picker("Select gender", selection : $selection) {
                ForEach(0..<genderRange.count) {
                    Text(self.genderRange[$0]).tag(self.genderRange[$0])
                }
            }
            .labelsHidden()
            .clipped()
       }
   }
}

Picker 的备用工作变体

Picker("Select gender", selection : $selection) {
    ForEach(genderRange, id: \.self) {
        Text($0)
    }
}

补充说明:标签文档的重要部分:

/// Use this modifier to differentiate among certain selectable views,
/// like the possible values of a ``Picker`` or the tabs of a ``TabView``.


/// A ``ForEach`` automatically applies a default tag to each enumerated
/// view using the `id` parameter of the corresponding element. If
/// the element's `id` parameter and the picker's `selection` input
/// have exactly the same type, you can omit the explicit tag modifier.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接