为什么我不能 select 选择器视图列表中的第一个数据?
Why I can't select my first data in the picker view list?
所以我在视图控制器中有一个按钮,如果我点击该标签,它会显示一个弹出窗口,实际上是一个选择器视图。
我将使用 present 模态显示弹出的选择器视图,使用下面的代码
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)
弹出的选择器视图将如下所示:
我在弹窗中使用的代码VC是这样的:
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
}
}
用户按下 'Choose' 按钮后,它将使用委托模式将选定的单位发送回调用者 VC。
但我这里有问题。如您所见,选择器视图的起始位置将始终为 "R16G"。如果我在选择器视图弹出后直接按 'choose' 按钮,它似乎总是给我一个空的所选数据字符串。 didSelectRow
好像没有触发。
但是如果我从 "R16G" 向下滚动到 "R22G" 然后按 'choose' 按钮,它会给出字符串 "R22G"。我选择R22G没问题
如果我从 "R16G" 向下滚动到 "R22G" 然后再回到 "R16G" 然后按 'choose' 按钮,它会给我字符串 "R16G",效果如我所料。
如果我不先向下滚动,选择器视图的第一个列表似乎不会返回字符串值。
这是我的问题的 .gif 文件:http://g.recordit.co/fRnvVJ2hi0.gif
我该如何解决这个问题?提前致谢:)
您可以将数组的第一个值存储为选定的,并且在 didSelect 中您可以使用当前值更新该变量。
所以在 viewDidLoad() 中添加这些行:
if !selectionList.isEmpty {
pickedData = selectionList[0]
}
didSelectRow
仅在用户实际与选择器交互以 select 新行时调用。最初显示选择器时不会调用它,因为用户没有 select 行。
您需要做的就是在您的按钮点击处理程序中访问选择器的当前值:
@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
委托方法。
所以我在视图控制器中有一个按钮,如果我点击该标签,它会显示一个弹出窗口,实际上是一个选择器视图。
我将使用 present 模态显示弹出的选择器视图,使用下面的代码
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)
弹出的选择器视图将如下所示:
我在弹窗中使用的代码VC是这样的:
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
}
}
用户按下 'Choose' 按钮后,它将使用委托模式将选定的单位发送回调用者 VC。
但我这里有问题。如您所见,选择器视图的起始位置将始终为 "R16G"。如果我在选择器视图弹出后直接按 'choose' 按钮,它似乎总是给我一个空的所选数据字符串。 didSelectRow
好像没有触发。
但是如果我从 "R16G" 向下滚动到 "R22G" 然后按 'choose' 按钮,它会给出字符串 "R22G"。我选择R22G没问题
如果我从 "R16G" 向下滚动到 "R22G" 然后再回到 "R16G" 然后按 'choose' 按钮,它会给我字符串 "R16G",效果如我所料。
如果我不先向下滚动,选择器视图的第一个列表似乎不会返回字符串值。
这是我的问题的 .gif 文件:http://g.recordit.co/fRnvVJ2hi0.gif
我该如何解决这个问题?提前致谢:)
您可以将数组的第一个值存储为选定的,并且在 didSelect 中您可以使用当前值更新该变量。
所以在 viewDidLoad() 中添加这些行:
if !selectionList.isEmpty {
pickedData = selectionList[0]
}
didSelectRow
仅在用户实际与选择器交互以 select 新行时调用。最初显示选择器时不会调用它,因为用户没有 select 行。
您需要做的就是在您的按钮点击处理程序中访问选择器的当前值:
@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
委托方法。