我有两个ViewControllers,一个用于数据,另一个用于选择UIPickerView中的数据。因此,在根ViewController中,我想要获取选择器视图的委托。我在尝试这个:
RootViewController:
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选择:
class SetReasonViewController : UIViewController {
@IBOutlet weak var txtFieldJustificativa: UITextView!
@IBOutlet weak var pickerOptions: UIPickerView!
override func viewDidLoad() {
}
}发布于 2018-10-15 16:59:33
Opt1:您需要在SetReasonViewControllervc中创建一个var
weak var delegate:RootVC?那么当它出现的时候
setReasonVc.delegate = self在此之后,viewDidLoad of SetReasonViewController
pickerOptions.delegate = delegate
/**pickerOptions.dataSource = delegate**/ un comment to make `SetReasonViewController ` the dataSourceclass RootVC:UIViewController,UIPickerViewDelegate {
//here implement didSelectRow
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
}
}Opt2:另一个简单的选择是做
setReasonVc.loadViewIfNeeded()
setReasonVc.pickerOptions.delegate = self警告当前代码
setReasonVc.pickerOptions.delegate = ???? // <- how to?当您在vc加载之前访问选择器时(此时为零),将导致崩溃,因此setReasonVc.loadViewIfNeeded()将修复它。
编辑:
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)
}
}发布于 2018-10-15 17:06:57
我认为您不能直接这样做,因为当您实例化VC时,视图还没有加载。
如果我是你,我会写SetReasonViewControllerDelegate
protocol SetReasonViewControllerDelegate : class {
func reasonDidChange(to reason: String)
}然后在RootVC中这样做
class RootViewController: UIViewController, SetReasonViewControllerDelegate {
func reasonDidChange(to reason: String) {
// do something here
}
}现在在SetReason VC中,您将self设置为delegate
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设置为它的委托:
setReasonVc.delegate = self发布于 2018-10-15 16:58:59
您需要有一个控制器,该控制器将为选择器填充数据,使其符合UIPickerViewDelegate,然后将其分配给setReasonVc.pickerOptions.delegate。您还需要通过遵循setReasonVc.pickerOptions.dataSource来设置UIPickerViewDataSource。
https://stackoverflow.com/questions/52821405
复制相似问题