我有两个视图控制器,一个用于数据,另一个用于在UIPickerView
中选取数据。因此,在根视图控制器中,我想获取选择器视图的委托。 我正在尝试这个:
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: {})
要选择的视图控制器:
class SetReasonViewController : UIViewController {
@IBOutlet weak var txtFieldJustificativa: UITextView!
@IBOutlet weak var pickerOptions: UIPickerView!
override func viewDidLoad() {
}
}
Opt1:你需要在 vcSetReasonViewController
创建一个变量
weak var delegate:RootVC?
然后当呈现它时
setReasonVc.delegate = self
之后在SetReasonViewController
viewDidLoad
pickerOptions.delegate = delegate
/**pickerOptions.dataSource = delegate**/ un comment to make `SetReasonViewController ` the dataSource
class 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)
}
}
我认为您不能直接执行此操作,因为在实例化 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
设置为该 VC 的委托:
setReasonVc.delegate = self
您需要具有控制器来填充选取器的数据以符合UIPickerViewDelegate,然后将其分配给setReasonVc.pickerOptions.delegate
。 您还需要通过符合 UIPickerViewDataSource 来设置setReasonVc.pickerOptions.dataSource
。