Swiftui Picker滚动浏览其列表时触发的事件

时间:2019-08-13 20:58:25

标签: swift uipickerview swiftui picker

我有一个SwiftUI Picker,我想在用户滚动列表时根据其值更新另一个视图。通过将@Binding传递给选择器,我可以在用户停止选择的项目时进行更新...但是我无法找到随着列表滚动而触发的事件。

使用旧的UIPickerView,您可以使用titleForRow来插入此as mentioned in this answer。我正在寻找适用于SwiftUI Picker的类似产品。

这是一个非常简单的SwiftUI代码段,该代码段演示了我试图找到一种解决方法的默认行为的问题:

import SwiftUI

struct ContentView: View {
    @State var selected:Int = 0
    var toDisplay:String {
        get {
            return "Selected: \(selected)"
        }
    }
    var body: some View {
        return VStack {
            Text(toDisplay)
            Form {
                Section{
                    Picker(selection: $selected, label: Text("")) {
                        ForEach(0..<100) {
                            Text("Item \($0)").tag($0)
                        }
                    }
                    .pickerStyle(WheelPickerStyle())
                    .frame(width: 350, height: 250, alignment: .center)
                }
            }
        }
    }
}

#if DEBUG
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
#endif

如果运行此命令,则可以看到直到选择器完全停止为止,顶部的Selected: #文本才会更新:

picker delay

1 个答案:

答案 0 :(得分:1)

如果您正在寻找一种仅使用SwiftUI的Picker来实现这一目标的方法,那么我相信您很不幸。由于SwiftUI的设计方式,您确实无法像使用UIKit一样访问这些视图的基础功能。如果您认为将titleForRowUIPickerView结合使用是可行的解决方案,那么最好的选择是使用UIViewRepresentable来移植UIPickerView以便与SwiftUI一起使用。