Ios 在Swift 5中将数据从UIPickerView传递到UIViewController

Ios 在Swift 5中将数据从UIPickerView传递到UIViewController,ios,swift,Ios,Swift,我目前正在尝试在Swift 5中构建一个简单的应用程序,它有一个主UIViewController: class TheList: UIViewController{ @IBOutlet var tableView: UITableView! override func viewDidLoad() { super.viewDidLoad() tableView.delegate = self tableView.dataSour

我目前正在尝试在Swift 5中构建一个简单的应用程序,它有一个主
UIViewController

class TheList: UIViewController{

    @IBOutlet var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.delegate = self
        tableView.dataSource = self
    }
    (...)
}
UIViewController
有一个使用
UITableViewDataSource
UITableViewDelegate
协议的扩展

extension TheList: UITableViewDelegate, UITableViewDataSource{

(...)

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        switch indexPath.row {
        case 0:
            let cell = tableView.dequeueReusableCell(withIdentifier: "titleViewCell")!
            return cell

(...)

}
它使用特定的动态
UITableViewCells
填充表格,这些单元格是它们自己的独立类。下面是一个例子:

class AmtTableViewCell: UITableViewCell{

    @IBOutlet var hoursPickerView: UIPickerView!

    override func awakeFromNib() {
        super.awakeFromNib()
        populate()
        hoursPickerView.delegate = self
        hoursPickerView.dataSource = self
    }

(...)
}

extension AmtTableViewCell: UIPickerViewDelegate, UIPickerViewDataSource{
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return pickerData.count
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return String(pickerData[row])
    }


}
正如您所看到的,
UITableViewCell
有一个
UIPickerView
的出口。我想以某种方式将数据从这个类的
UIPickerView
传递到我的
UIViewController
,以便在那里进一步解析它。我试图创建一个方法来实现这一点,然后在我的视图控制器中调用它,但从我的理解来看,我必须首先实例化它,这就扼杀了这一点,因为我希望从用户在屏幕上看到的实例中获取值

我还尝试在我的视图控制器中为选择器创建一个出口,然后将其委托和数据源设置为
AmtTableViewCell
类,而不是
self
,但我知道我不能将
UIPickerView
放在我的
UIViewController

感谢您的帮助。

使用闭包:

class AmtTableViewCell: UITableViewCell{

    @IBOutlet var hoursPickerView: UIPickerView!
    var selectedValueInPicker: ((String) -> Void)?
    override func awakeFromNib() {
        super.awakeFromNib()
        populate()
        hoursPickerView.delegate = self
        hoursPickerView.dataSource = self
    }

(...)
}
extension AmtTableViewCell: UIPickerViewDelegate, UIPickerViewDataSource{
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return pickerData.count
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return String(pickerData[row])
    }
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int){
        selectedValueInPicker?(String(pickerData[row]))
    }

}

extension TheList: UITableViewDelegate, UITableViewDataSource{

(...)

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        switch indexPath.row {
        case 0:
            let cell = tableView.dequeueReusableCell(withIdentifier: "titleViewCell") as? AmtTableViewCell
            cell.selectedValueInPicker = { val in
               //Do what is needed with the Stirng val that is comming from the cell passes in closure
            }
            return cell ?? AmtTableViewCell()

(...)

}
使用协议委托

protocol PickerSelectedValue{
    func didSelectValueInPicker(value: String)
}

class AmtTableViewCell: UITableViewCell{

    @IBOutlet var hoursPickerView: UIPickerView!
    var delegate: PickerSelectedValue?
    override func awakeFromNib() {
        super.awakeFromNib()
        populate()
        hoursPickerView.delegate = self
        hoursPickerView.dataSource = self
    }

(...)
}
extension AmtTableViewCell: UIPickerViewDelegate, UIPickerViewDataSource{
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return pickerData.count
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return String(pickerData[row])
    }
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int){
        delegate?.didSelectValueInPicker(String(pickerData[row]))
    }

}

extension TheList: UITableViewDelegate, UITableViewDataSource,pickerSelectedValue{

(...)

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        switch indexPath.row {
        case 0:
            let cell = tableView.dequeueReusableCell(withIdentifier: "titleViewCell") as? AmtTableViewCell
            cell?.delegate = self
            return cell ?? AmtTableViewCell()

(...)
    func didSelectValueInPicker(value: String){
        print("the selected value in picker was",value)
    }

}

委托协议的代码有点长,但可能更容易理解,但与闭包不兼容。

您有两个选项闭包和委托。如何处理选择器选择未显示。您是否设置了自定义按钮,或者仅设置了picker委托方法DidSelectItem谢谢您的回答,我仍然无法使用任何一种方法。代码在语义上是正确的,并且确实可以编译,但是数据似乎没有被传递,或者我做了一些错误的事情。使用委托方法,在列表类中我创建了一个变量“a”,然后在didSelectValueInPicker函数中我放置了“a=value”,并创建了一个按钮操作,它应该打印“a”,我希望它这样做,但它不会。如果没有look you代码,它就会出错,更新它以显示您的更改,以帮助您找出错误配置的按钮是我的错!我可以确认委托方法现在运行良好,谢谢您的帮助。