当 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 那样访问这些视图的底层功能。如果您认为将titleForRowUIPickerView 结合使用是一种可行的解决方案,那么最好的办法是使用UIViewRepresentableUIPickerView 移植到SwiftUI 上。

【讨论】:

以上是关于当 Swiftui Picker 滚动其列表时触发的事件的主要内容,如果未能解决你的问题,请参考以下文章

在 SwiftUI 列表/表单中禁用滚动

SwiftUI Picker 手动触发扩展

当 Picker selectedValue 更改时,SwiftUI 2.0 App 崩溃

SwiftUI - 防止列表在项目选择时将滚动位置重置为顶部

SwiftUI 滚动/列表滚动事件

SwiftUI 为啥 Picker 上的输入不起作用?