为啥我不能在选择器视图列表中选择我的第一个数据?
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 选择器只选择特定网站上的第一个层次结构元素?