关于swift:事件在Swiftui Picker滚动浏览其列表时触发

Event that fires as Swiftui Picker scrolls through its list

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

使用旧的UIPickerView,您可以使用titleForRow将此问题挂钩,如本答案所述。 我正在寻找与SwiftUI的Picker相似的东西。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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


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