Если вы просто пытаетесь заставить ваши данные отображаться, вы можете просто установить источник данных и делегировать его следующим образом:
lenghtPickerView.delegate = lenghtPickerView
lenghtPickerView.dataSource = lenghtPickerView
https://ibb.co/2gRVTxJ
Но если я понимаюваш вопрос правильно, и вы пытаетесь получить значение из окна выбора и установить значение текстового поля из него и сделать его многоразовым, возможно, вы захотите сделать это немного по-другому.
Вот один из вариантов: LengthPickerViewDelegate является необязательным,если вам не нужно ничего делать, кроме установки значения textfield.text
class MainViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = .white
let pickerViewTextField = LengthPickerView(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: 50))
pickerViewTextField.placeholder = "Select Length"
pickerViewTextField.center = self.view.center
pickerViewTextField.pickerDelegate = self
self.view.addSubview(pickerViewTextField)
}
}
extension MainViewController: LengthPickerViewDelegate {
func doSomething() {
//
print("Picker view value changed")
}
}
protocol LengthPickerViewDelegate: class {
// do something, pass values to mainVC if needed
func doSomething()
}
class LengthPickerView: UITextField {
let feet = Array(4...7)
let inches = Array(1...11)
lazy var pickerView: UIPickerView = {
let pickerView = UIPickerView()
pickerView.delegate = self
pickerView.dataSource = self
return pickerView
}()
weak var pickerDelegate: LengthPickerViewDelegate?
var selectedValue: String {
get {
return "\(feet[pickerView.selectedRow(inComponent: 0)]) ft \(inches[pickerView.selectedRow(inComponent: 1)]) in"
}
}
override init(frame: CGRect) {
super.init(frame: frame)
self.inputView = pickerView
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
extension LengthPickerView: UIPickerViewDataSource {
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 2
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
if component == 0 {
return feet.count
} else {
return inches.count
}
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
if component == 0 {
return String(feet[row])
} else {
return String(inches[row])
}
}
}
extension LengthPickerView: UIPickerViewDelegate {
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
// do something with selected values, if you need a calculation done
self.pickerDelegate?.doSomething()
// or if you only want to set the textfield value
self.text = selectedValue
}
}