首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何只提供回调函数或块,而不是创建符合UIPickerViewDelegate的对象?

如何只提供回调函数或块,而不是创建符合UIPickerViewDelegate的对象?
EN

Stack Overflow用户
提问于 2018-10-15 16:55:40
回答 3查看 53关注 0票数 2

我有两个ViewControllers,一个用于数据,另一个用于选择UIPickerView中的数据。因此,在根ViewController中,我想要获取选择器视图的委托。我在尝试这个:

RootViewController:

代码语言:javascript
复制
 let setReasonVc = self.storyboard?.instantiateViewController(withIdentifier: "setReasonVc") as! SetReasonViewController
 setReasonVc.providesPresentationContextTransitionStyle = true
 setReasonVc.definesPresentationContext = true
 setReasonVc.modalTransitionStyle = UIModalTransitionStyle.crossDissolve
 setReasonVc.modalPresentationStyle = UIModalPresentationStyle.overCurrentContext

 setReasonVc.pickerOptions.delegate = ???? // <- how to?

 self.present(setReasonVc, animated: true, completion: {})

ViewController选择:

代码语言:javascript
复制
class SetReasonViewController : UIViewController {

@IBOutlet weak var txtFieldJustificativa: UITextView!
@IBOutlet weak var pickerOptions: UIPickerView!

override func viewDidLoad() {

     }

}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-10-15 16:59:33

Opt1:您需要在SetReasonViewControllervc中创建一个var

代码语言:javascript
复制
weak var delegate:RootVC?

那么当它出现的时候

代码语言:javascript
复制
setReasonVc.delegate = self

在此之后,viewDidLoad of SetReasonViewController

代码语言:javascript
复制
pickerOptions.delegate = delegate
/**pickerOptions.dataSource = delegate**/ un comment to make `SetReasonViewController ` the dataSource
代码语言:javascript
复制
class RootVC:UIViewController,UIPickerViewDelegate {
  //here implement didSelectRow
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

    }
 }

Opt2:另一个简单的选择是做

代码语言:javascript
复制
setReasonVc.loadViewIfNeeded()
setReasonVc.pickerOptions.delegate = self

警告当前代码

代码语言:javascript
复制
setReasonVc.pickerOptions.delegate = ???? // <- how to?

当您在vc加载之前访问选择器时(此时为零),将导致崩溃,因此setReasonVc.loadViewIfNeeded()将修复它。

编辑:

代码语言:javascript
复制
class RootVC: UIViewController {

     func myNavigate() {

        let setReasonVc = self.storyboard?.instantiateViewController(withIdentifier: "setReasonVc") as! SetReasonViewController
        setReasonVc.providesPresentationContextTransitionStyle = true
        setReasonVc.definesPresentationContext = true
        setReasonVc.modalTransitionStyle = UIModalTransitionStyle.crossDissolve
        setReasonVc.modalPresentationStyle = UIModalPresentationStyle.overCurrentContext
        setReasonVc.callback = { (ind) in
            print(ind)
        }
        self.present(setReasonVc, animated: true, completion: {})
    }
}

class SetReasonViewController: UIViewController , UIPickerViewDelegate {

    var callback:((Int)->())?

    override func viewDidLoad() {
        super.viewDidLoad() 
       pickerOptions.delegate = self
    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

        callback?(row)

    }

}
票数 1
EN

Stack Overflow用户

发布于 2018-10-15 17:06:57

我认为您不能直接这样做,因为当您实例化VC时,视图还没有加载。

如果我是你,我会写SetReasonViewControllerDelegate

代码语言:javascript
复制
protocol SetReasonViewControllerDelegate : class {
    func reasonDidChange(to reason: String)
}

然后在RootVC中这样做

代码语言:javascript
复制
class RootViewController: UIViewController, SetReasonViewControllerDelegate {
    func reasonDidChange(to reason: String) {
        // do something here
    }
}

现在在SetReason VC中,您将self设置为delegate

代码语言:javascript
复制
class SetReasonViewController: UIViewController, UIPickerViewDelegate {
    let reasons = [...]
    weak var delegate: SetReasonViewControllerDelegate?

    override func viewDidLoad() {
        pickerOptions.delegate = self
    }
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        delegate?.reasonDidChange(to: reasons[row])
    }
    // other delegate methods...
}

当您显示设置原因VC时,您将self设置为它的委托:

代码语言:javascript
复制
setReasonVc.delegate = self
票数 1
EN

Stack Overflow用户

发布于 2018-10-15 16:58:59

您需要有一个控制器,该控制器将为选择器填充数据,使其符合UIPickerViewDelegate,然后将其分配给setReasonVc.pickerOptions.delegate。您还需要通过遵循setReasonVc.pickerOptions.dataSource来设置UIPickerViewDataSource

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52821405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档