swift 设置选择器默认没有可点击的值作为标题

uqdfh47h  于 2023-06-28  发布在  Swift
关注(0)|答案(2)|浏览(124)

我正在尝试开发一个Picker,它的字段与标题相对应。问题是我不明白如何使用Picker视图的title字段。
这是密码问题是Pickerstring "Spain"为标题。相反,我想要的标题"Select country"是可见的,直到用户选择一个字段。

struct CustomPicker: View {
    
    @State private var selection = "Select country"
    let colors = ["Spain", "France"]
    
    var body: some View {
        VStack(alignment: .leading, spacing: 4, content: {
    
            HStack(spacing: 15) {
                
                Picker("Select country", selection: $selection) {
                    ForEach(colors, id: \.self) {
                        Text($0)
                    }
                }
                .pickerStyle(DefaultPickerStyle())
            }
            
            .padding(.horizontal, 20)
        })
            .frame(height: 50)
            .background(.white)
            .cornerRadius(10)
            .padding(.horizontal, 20)
    }
}
dy1byipe

dy1byipe1#

你尝试做的事情并不是SwiftUI的标准。你将不得不为这个定制你的UI(这可能并不困难)。根据您愿意妥协的程度,您可以通过对代码的轻微调整来获得您想要的内容。这是列表中的选择器(以及列表中的选择器)的外观。
为此,我稍微修改了您的代码,以包含国家/地区的枚举。

enum Country: String, CaseIterable, Identifiable {
    case spain, france, germany, switzerland
    var id: Self { self }
}

struct CustomPicker: View {
    
    @State private var selection: Country = .spain
    
    var body: some View {
        NavigationView {
            List {
                Picker("Select Country", selection: $selection) {
                    ForEach(Country.allCases, id: \.self) {
                        Text($0.rawValue.capitalized)
                            .tag($0)
                    }
                }
                Picker("Select Country", selection: $selection) {
                    ForEach(Country.allCases, id: \.self) {
                        Text($0.rawValue.capitalized)
                            .tag($0)
                    }
                }
                .pickerStyle(.menu)
            }
            .navigationBarTitleDisplayMode(.inline)
            .navigationTitle("Country Picker")
        }
    }
}

hlswsv35

hlswsv352#

在项目之前的选择器循环中,可以添加一个带有标签(-1)的Text(),使其成为第一个Item

Picker("Select Country", selection: $selection) {
                    Text("Select")
                        .tag(-1)
                    ForEach(Country.allCases, id: \.self) {
                        Text($0.rawValue.capitalized)
                            .tag($0)
                    }
                }
                .pickerStyle(.menu)

相关问题