Итак, у меня есть кнопка в контроллере вида, и если я коснусь этой метки, она покажет всплывающее окно, которое на самом деле является видом сборщика.
Я покажу всплывающее окно выбора, используя модально подарок, используя код ниже
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
Как я мог это исправить? Заранее спасибо:)