UIPickerView - 第一行选择不调用didSelectRow(在Swift中)

问题描述 投票:1回答:2

我有一个UIPickerView,当用户选择一行并按下一个名为“Start”的按钮时,所选的行将启动一个特定的方法。

要检测选择器中的选定行(并更新变量),我使用以下代码:

    var picked = 15

    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

        if row == 0 {
            picked = 1
       }
        else if row == 1 {
           picked = 2
       }
        else if row == 2 {
           picked = 3
       }
    }

只要用户对选择器选择进行CHANGE,就会触发此方法。但是如果用户没有在选择器上选择任何值(bc,用户想要选择已经选择的第一个选项),则不调用此方法。

我知道关于这个问题已经有一个很好的答案,但这是针对Objective C(uipickerview-1st-row-selection-does-not-call-didselectrow)。我想要Swift的答案,bc我没有盲目的C技能。

所以我的问题是:如何让选择器的第一个选项(已经被选中)被用户检测为选定的行? (所以这个已经选中的行将更新变量)

我在viewDidAppear中添加了代码:

        picker1.selectRow(2, inComponent: 0, animated: true)
        // scrolls the specified row to center.

但这只显示指定的行,而不是RETURNS指定的didSelectRow函数行。所以这不适合我

ios swift uipickerview
2个回答
2
投票

文档说(在https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIPickerViewDelegate_Protocol/index.html#//apple_ref/occ/intfm/UIPickerViewDelegate/pickerView:didSelectRow:inComponent:):“当用户选择组件中的行时,由选择器视图调用。”。因此,您应该通过 - (NSInteger)selectedRowInComponent :( NSInteger)component / func selectedRowInComponent(_ component:Int) - > Int来查询拾取器本身的状态。


3
投票

解决此问题的一种简单易用的方法是将每个选择器中的行零作为用户邀请而不是处理的值。您可以在零行中添加“选择”或“---”之类的内容。这样,用户将被迫与选择器进行交互,并且不会依赖于被动地坐在那里的默认值。这在多组件拾取器中特别有用,其中用户可以以其他方式改变一些但不是所有组件。

© www.soinside.com 2019 - 2024. All rights reserved.