簡體   English   中英

SwiftUI 表單中的選取器不顯示所選行

[英]SwiftUI Picker in a Form doesn't show the selected row

我試圖有一個選擇器來顯示當前選擇了哪個選項。

嘗試以下代碼,它正確選擇了正確的選項,但選擇器不顯示選擇了哪個選項:

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 觀察到

我創建了一個我稱之為“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
    )
}

這是 Xcode 11.1 中的一個錯誤,只需更新到 Xcode 11.2,一切都會好起來的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM