Я не могу установить источник данных uipickerview и делегировать из внешнего файла - PullRequest
0 голосов
/ 24 сентября 2019

Я не могу установить свой внешний источник данных pickerview и делегировать мой основной вид.Я могу это установить подальше?Я хочу сохранить свое окно выбора в отдельном файле из-за других представлений будущего, которые могли бы использовать его

Это мое собственное представление средства выбора

final class LenghtPickerView: UIPickerView, UIPickerViewDataSource, UIPickerViewDelegate {

    let feet = Array(4...7)
    let inches = Array(1...11)

    private var textFieldBeginEdited: UITextField?

    var selectedValue: String {
        get {
            return "\(feet[selectedRow(inComponent: 0)]) ft \(inches[selectedRow(inComponent: 0)]) in"
        }
    }

    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])
        }
    }
}

и в моем основном виде объявление его private let lenghtPickerView = LenghtPickerView()также попытался private let lenghtPickerView: LenghtPickerView = LenghtPickerView()

не могу установить источник данных и делегировать для отображения данных

lenghtPickerView.delegate = self
lenghtPickerView.dataSource = self 

Ответы [ 2 ]

0 голосов
/ 24 сентября 2019

Если вы просто пытаетесь заставить ваши данные отображаться, вы можете просто установить источник данных и делегировать его следующим образом:

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
}
}
0 голосов
/ 24 сентября 2019

Если вы установили

lenghtPickerView.delegate = self

lenghtPickerView.dataSource = self

в главном окне.

Это означает, что делегат и источник данных вашего сборщика должныбыть принятым в вашем главном представлении

...