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

时间:2015-09-23 12:59:47

标签: ios swift uipickerview

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

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

    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,用户想要选择已经选择的第一个选项),则不会调用此方法。

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

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

我添加了viewDidAppear中的代码:

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

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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分: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) - >来查询选择器本身的状态。国际