为啥我不能在选择器视图列表中选择我的第一个数据?

Posted

技术标签:

【中文标题】为啥我不能在选择器视图列表中选择我的第一个数据?【英文标题】:Why I can't select my first data in the picker view list?为什么我不能在选择器视图列表中选择我的第一个数据? 【发布时间】:2018-05-14 07:43:17 【问题描述】:

所以我在视图控制器中有一个按钮,如果我点击该标签,它会显示一个弹出窗口,实际上是一个选择器视图。

我将使用下面的代码以模式方式显示选择器视图弹出

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let popup = storyboard.instantiateViewController(withIdentifier: "dataPickerPopup") as! DataPickerPopUpVC
popup.delegate = self
popup.selectionList = ["R16G","R22G"]
popup.titlePopup = "UNITS"
popup.startingData = availableUnits[0]
present(popup, animated: true, completion: nil)

选择器视图弹出将如下所示:

我在popupVC中使用的代码是这样的:

import UIKit


protocol DataPickerPopupDelegate 
    func selectedValueFromPopUp (data: String)




class DataPickerPopUpVC: UIViewController 

    @IBOutlet weak var titlePopupLabel: UILabel!
    @IBOutlet weak var pickerView: UIPickerView!
    @IBOutlet weak var saveButton: UIButton!

    var selectionList : [String]!
    var pickedData = ""
    var startingData = ""
    var titlePopup = ""

    var delegate : DataPickerPopupDelegate?



    override func viewDidLoad() 
        super.viewDidLoad()

        pickerView.delegate = self
        setPickerViewStartingPosition()
        titlePopupLabel.text = titlePopup

    


    @IBAction func saveButtonDidPressed(_ sender: Any) 

        // picked data will be sent to caller VC using protocol delegate pattern.

        delegate?.selectedValueFromPopUp(data: pickedData)
        dismiss(animated: true, completion: nil)
    


    @IBAction func closeReusablePopup(_ sender: Any) 
        dismiss(animated: true, completion: nil)
    






extension DataPickerPopUpVC 
    // MARK: - Helper Methods

    func setPickerViewStartingPosition() 
        let index = selectionList.index(of: startingData)
        pickerView.selectRow(index ?? 0, inComponent: 0, animated: false)
    




// MARK: - Picker View Delegate & Data Source
extension DataPickerPopUpVC : UIPickerViewDelegate, UIPickerViewDataSource 

    func numberOfComponents(in pickerView: UIPickerView) -> Int 
        return 1
    

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int 
        return selectionList.count
    


    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) 
        pickedData = selectionList[row]
    


    func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView 
        let pickerLabel = UILabel()
        if UIDevice.current.userInterfaceIdiom == .pad 
            pickerLabel.font = UIFont.systemFont(ofSize: 40)
            pickerLabel.text = selectionList[row]
            pickerLabel.textAlignment = .center
         else if UIDevice.current.userInterfaceIdiom == .phone 
            pickerLabel.font = UIFont.systemFont(ofSize: 25)
            pickerLabel.text = selectionList[row]
            pickerLabel.textAlignment = .center
        
        return pickerLabel
    




用户按下“选择”按钮后,它将使用委托模式将选定的单元发送回调用方 VC。

但是我这里有问题。如您所见,选择器视图的起始位置将始终为“R16G”。如果我在弹出选择器视图后直接按“选择”按钮,似乎它总是会给我一个空的选定数据字符串。 didSelectRow 好像没有触发。

但是如果我从“R16G”向下滚动到“R22G”,然后按“选择”按钮,它会给出字符串“R22G”。如果我选择 R22G,我没有问题。

如果我从“R16G”向下滚动到“R22G”,然后再次返回到“R16G”,然后按“选择”按钮,它会给我字符串“R16G”,它可以按预期工作。

如果我不先向下滚动,选择器视图的第一个列表似乎没有返回字符串值。

这是我的问题的 .gif 文件:http://g.recordit.co/fRnvVJ2hi0.gif

我该如何解决这个问题?在此先感谢:)

【问题讨论】:

在下面查看我的答案。从 UI 的角度来看,“选择”可能是比“选择”更好的动词 didSelectRow 将在您更改选择指示器时被调用,在 gif 中我们看到您没有第二次更改选择指示器,因为@Paulw11 说您需要 pickerView.selectedRow 方法来获取当前行显示给用户 【参考方案1】:

您可以将数组的第一个值存储为选定的,并且在 didSelect 中您可以使用当前值更新该变量。

所以在 viewDidLoad() 中添加这些行:

if !selectionList.isEmpty 
   pickedData = selectionList[0]

【讨论】:

【参考方案2】:

didSelectRow 仅在用户实际与选择器交互以选择新行时调用。最初显示选择器时不会调用它,因为用户没有选择行。

您需要做的就是在您的按钮点击处理程序中访问选择器的当前值:

@IBAction func saveButtonDidPressed(_ sender: Any) 

    // picked data will be sent to caller VC using protocol delegate pattern.
    let pickedData = selectionList[pickerView.selectedRow(inComponent:0)]
    delegate?.selectedValueFromPopUp(data: pickedData)
    dismiss(animated: true, completion: nil)

您不需要pickedData 属性或didSelect 委托方法。

【讨论】:

以上是关于为啥我不能在选择器视图列表中选择我的第一个数据?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 jQuery 选择器只选择特定网站上的第一个层次结构元素?

在 UIPickerView 上选择行时如何使用信息填充第二个视图控制器

为啥我有两个选择器?

选择器视图选项填充标签

为啥我不能选择侧面菜单中的第一项?

选择自定义选择器视图中的第一行时如何禁用按钮?