этот код меня очень злит. Я уже прочитал тысячи руководств и комментариев о переполнении стека ....
Пожалуйста помогите. Средство выбора просто содержит пустой серый экран.
Код здесь:
GenderPickerModel.swift
import UIKit
class GenderPickerModel: NSObject, UIPickerViewDataSource, UIPickerViewDelegate {
let genderPickerData: [String] = ["male", "female"]
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1;
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return genderPickerData.count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return genderPickerData[row]
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
}
}
и используется в контроллере:
@IBOutlet weak var gender: UITextField!
private var genderPickerView: UIPickerView?
override func viewDidLoad() {
super.viewDidLoad()
loadProfile()
prepareView()
}
func prepareView() {
genderPickerView = UIPickerView.init()
let gpModel = GenderPickerModel()
genderPickerView?.delegate = gpModel
genderPickerView?.dataSource = gpModel
gender.inputView = genderPickerView;
genderPickerView?.selectRow(0, inComponent: 0, animated: true)
genderPickerView?.reloadAllComponents()
}
Бьюсь об заклад, что если вы поместите точки останова внутри модели, она не остановится на этом, что означает, что делегаты не работают
@AbhishekJadhav, потому что этот контроллер содержит 5 PickerViews. Я хотел отделить их от класса контроллера
@ironRoei а почему? В чем разница в наличии отдельного класса для данных и включении кода внутри вызывающего контроллера?





Во-первых, вам не нужно создавать отдельный массив пола в классе pickerview, и вам не нужно создавать экземпляр pickerview.
Отсюда вы можете увидеть свой источник данных в своем custompickerview.
/**
Controller code where you can create instantiate picker assign data
*/
class ViewController: UIViewController {
@IBOutlet weak var textField: UITextField!
let genderPickerData : [String] = ["male", "female"]
override func viewDidLoad() {
super.viewDidLoad()
prepareView()
}
func prepareView() {
genderPickerView = UIPickerView()
let gpModel = GenderPickerModel()
gpModel.data = genderPickerData
gpModel.dataSource = gpModel
gpModel.delegate = gpModel
textField.inputView = gpModel
}
}
/**
Custom pickerview class where you can handle data
*/
import UIKit
class GenderPickerModel: UIPickerView, UIPickerViewDataSource, UIPickerViewDelegate {
var data = [String]()
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return data.count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return data[row]
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
}
}
Спасибо, но контент все еще пуст! :(
Я пробовал этот код, он работает, показывая источник данных в pickerview, потому что я упоминаю, что вам нужно создать собственный класс pickerview и реализовать?
Почему вы создаете экземпляр GenderPickerModel и назначаете его источнику данных и делегату. Можете ли вы сказать мне весь этот код в одном контроллере или нет?