Как обеспечить функцию или блок обратного вызова только вместо создания объекта, который соответствует UIPickerViewDelegate? - PullRequest
0 голосов
/ 15 октября 2018

У меня есть два ViewController, один для данных и другой для выбора данных в 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() {

     }

}

Ответы [ 3 ]

0 голосов
/ 15 октября 2018

Opt1: Вам нужно создать переменную внутри SetReasonViewController vc

weak var delegate:RootVC?

Затем, когда она присутствует,

setReasonVc.delegate = self

после этого в viewDidLoadиз SetReasonViewController

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)

    }

}
0 голосов
/ 15 октября 2018

Я думаю, что вы не можете напрямую сделать это, потому что во время создания экземпляра 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
0 голосов
/ 15 октября 2018

Вам необходимо иметь контроллер, который будет заполнять данные, чтобы сборщик соответствовал UIPickerViewDelegate , а затем просто назначить его setReasonVc.pickerOptions.delegate.Вам также необходимо установить setReasonVc.pickerOptions.dataSource, указав UIPickerViewDataSource .

...