当 Swiftui Picker 滚动其列表时触发的事件
Posted
技术标签:
【中文标题】当 Swiftui Picker 滚动其列表时触发的事件【英文标题】:Event that fires as Swiftui Picker scrolls through its list 【发布时间】:2019-08-13 20:58:25 【问题描述】:我有一个 SwiftUI Picker
,我想在用户滚动列表时根据它的值更新另一个视图。通过将@Binding
传递给选择器,我可以在用户停在所选项目上时进行更新...但我无法找到在列表滚动时触发的事件。
使用旧的UIPickerView
,您可以使用titleForRow
连接到这个as mentioned in this answer。我正在寻找适用于 SwiftUI 的 Picker
的类似功能。
这是一个非常简单的 SwiftUI sn-p,它演示了我试图找到解决方法的默认行为问题:
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: #
文本直到选择器完全停止才会更新:
【问题讨论】:
原来的UIPickerView
的行为也完全一样。
您提到的将titleForRow
与 UIPickerView 一起使用的链接是一个 hack,因为 titleForRow
被多次调用,并且不一定是通过选择器视图中心的行。
我可以使用“hacky”解决方案。我只是不想为此完全重建我自己的自定义版本的Picker
。
【参考方案1】:
如果您正在寻找一种仅使用 SwiftUI 的 Picker
来实现此目的的方法,那么我相信您不走运。由于 SwiftUI 的设计方式,您实际上无法像使用 UIKit 那样访问这些视图的底层功能。如果您认为将titleForRow
与UIPickerView
结合使用是一种可行的解决方案,那么最好的办法是使用UIViewRepresentable
将UIPickerView
移植到SwiftUI 上。
【讨论】:
以上是关于当 Swiftui Picker 滚动其列表时触发的事件的主要内容,如果未能解决你的问题,请参考以下文章
当 Picker selectedValue 更改时,SwiftUI 2.0 App 崩溃