所以我在视图控制器中有一个按钮,如果我点击该标签,它会显示一个实际上是选择器视图的弹出窗口。
我将使用下面的代码
以模态方式显示弹出的选择器视图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
}
}
用户按“选择”按钮后,将使用委托模式将所选单位发送回来电。
但我在这里有点不对劲。如您所见,选择器视图的起始位置始终为“R16G”。如果我在弹出的选择器视图弹出后直接按下“选择”按钮,它似乎总会给我一个空的选定数据串。似乎没有触发didSelectRow
。
但是如果我从“R16G”向下滚动到“R22G”然后按“选择”按钮,它将给出字符串“R22G”。如果我选择R22G,我没有问题。
如果我从“R16G”向下滚动到“R22G”然后再回到“R16G”然后再按“选择”按钮,它会给我字符串“R16G”,它按预期工作。
如果我不首先向下滚动,似乎第一个选择器视图列表没有给我一个字符串值。
以下是我的问题的.gif文件:http://g.recordit.co/fRnvVJ2hi0.gif
我该如何解决这个问题?在此先感谢:)
答案 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
委托方法。