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



我有两个视图控制器,一个用于数据,另一个用于在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

之后在SetReasonViewControllerviewDidLoad

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

最新更新