表单中的 SwiftUI Picker 不显示所选行

Posted

技术标签:

【中文标题】表单中的 SwiftUI Picker 不显示所选行【英文标题】:SwiftUI Picker in a Form doesn't show the selected row 【发布时间】:2019-10-16 05:17:31 【问题描述】:

我正在尝试使用一个选择器来显示当前选择了哪个选项。

尝试以下代码,它正确选择了正确的选项,但选择器不显示选择了哪个选项:

import SwiftUI

struct ContentView: View 
@State var selectedIndex: Int = 0

let strings: [String] = 
    var strings: [String] = []
    for i in 0..<10 
        strings.append("\(i)")
    
    return strings
()

var body: some View 
    NavigationView 
        VStack 
            Form 
                Picker(selection: $selectedIndex,
                       label: Text("Selected string: \(strings[selectedIndex])")) 
                    ForEach(0..<strings.count) 
                        Text(self.strings[$0]).tag($0)
                    
                
            
        
        .navigationBarTitle("Form Picker",
                            displayMode: NavigationBarItem.TitleDisplayMode.inline)
    




struct ContentView_Previews: PreviewProvider 
    static var previews: some View 
        ContentView()
    

有人知道可能是什么问题吗?这是使用 Xcode 11.1 和 ios 13.1 观察到的

【问题讨论】:

从 Xcode 13 和 iOS15 开始,选择器似乎显示选择了哪个选项。 【参考方案1】:

我创建了一个简单的选择器,我称之为“ListPicker”,它应该符合要求。我已经写了它,所以它在表单中运行良好;如果您在表单之外需要它,您将不得不修改它。如果您看到任何改进代码的方法,请添加评论;这仍然是我们所有人的学习经历。

// MARK: - LIST PICKER (PUBLIC)

struct ListPicker<Content: View>: View 
    @Binding var selectedItem: Int
    var label: () -> Content
    var data: [Any]

    var selectedLabel: String 
        selectedItem >= 0 ? "\(data[selectedItem])" : ""
    

    var body: some View 
        NavigationLink(destination: ListPickerContent(selectedItem: self.$selectedItem, data: self.data)) 
            ListPickerLabel(label: self.label, value: "\(self.selectedLabel)")
        
    


// MARK: - INTERNAL

private struct ListPickerLabel<Content: View>: View 
    let label: () -> Content
    let value: String

    var body: some View 
        HStack(alignment: .center) 
            self.label()
            Spacer()
            Text(value)
                .padding(.leading, 8)
        
    


private struct ListPickerContentItem: View 
    let label: String
    let index: Int
    let isSelected: Bool
    var body: some View 
        HStack 
            Text(label)
            Spacer()
            if isSelected 
                Image(systemName: "checkmark")
                    .foregroundColor(.accentColor)
            
        .background(Color.white) // so the entire row is selectable
    


private struct ListPickerContent: View 
    @Environment(\.presentationMode) var presentationMode
    @Binding var selectedItem: Int
    var data: [Any]
    var body: some View 
        List 
            ForEach(0..<data.count)  index in
                ListPickerContentItem(label: "\(self.data[index])", index: index, isSelected: index == self.selectedItem).onTapGesture 
                    self.selectedItem = index
                    self.presentationMode.wrappedValue.dismiss()
                
            
        
    

那么你可以这样使用它:

@State var selectedCar: Int = 0
let cars = ["Jaguar", "Audi", "BMW", "Land Rover"]

Form 
    ListPicker(
        selectedItem: self.$selectedCar, 
        label: 
            Text("Cars")
        , 
        data: self.cars
    )

【讨论】:

以上是关于表单中的 SwiftUI Picker 不显示所选行的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 SwiftUI Picker 代码不起作用?

SwiftUI Picker 填充问题 - 选择器中的 ForEach 循环不填充

SwiftUI:如何根据 Picker 的值更新 ForEach 循环的范围

表单中的 SwiftUI 选择器 - 索引超出范围

SwiftUI 选择器为所选项目和选择视图分隔文本

SwiftUI Picker 视图中不显示值