为什么我无法在选择器视图列表中选择我的第一个数据?

时间:2018-05-14 07:43:17

标签: ios swift uipickerview

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

我将使用下面的代码

以模态方式显示弹出的选择器视图
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)

弹出的选择器视图将如下所示: enter image description here

我在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
    }



}

用户按“选择”按钮后,将使用委托模式将所选单位发送回来电。

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

所以在viewDidLoad()中添加以下行:

if !selectionList.isEmpty {
   pickedData = selectionList[0]
}

答案 1 :(得分:1)

仅当用户实际与选择器交互以选择新行时,才会调用

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委托方法。