在两个ViewControllers(委托)之间传递数据 - Swift

Саш*_*нко 8 modal-dialog ios segue swift

我有两个 ViewController's.

  1. FirstVC- 我有labelbuttonsegue"莫代尔"

  2. SecondVC- 我有(PickerViewbutton回到FirstVC):

    @IBAction func bntback(sender: AnyObject) {
              self.dissmissViewControllerAnimatied(true, completion: nil)
        }
    
    Run Code Online (Sandbox Code Playgroud)

我创建了代表SecondViewController:

protocol SendDataDelegate {
   func sendData(text:String)
}
Run Code Online (Sandbox Code Playgroud)

下一个:

class SecondVC: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {
      var delegate: SendDataDelegate!
      var firstvc = FirstVC()
      var arr = ["First", "Second", "Third"]
      @IBOutlet var pickview: UIPickerView!
      override func viewDidLoad() {
         super.viewDidLoad()
         pickview.dataSource = self
         pickview.selegate = self
     }
Run Code Online (Sandbox Code Playgroud)

我的函数PickerView和函数我使用我的委托作为:

func pickerView (pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
  var text = arr[row]
  dispatch_async(dispatch_get_main_quene(), {
  self.delegate.sendData(text)//there is an error: "fatal error: unexpectedly found nil while unwrapping an Optional value"
  )}
}
Run Code Online (Sandbox Code Playgroud)

FirstVC:

class FirstVC: UIViewController, SendDataDelegate {
      var data = SecondVC()
      //....
      override func viewDidLoad() {
         super.viewDidLoad()
         self.data.delegate = self
     }
     func sendData (text:String) {
        mylable.text = text
        //or 
        //var txt = text
       //mylable.text = txt
     }
 }
Run Code Online (Sandbox Code Playgroud)

请帮我解决这个问题.

Kle*_*son 7

1)您需要将委托设置为prepareForSegue:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if let viewController = segue.destinationViewController as? SecondVC {
        viewController.delegate = self
    }
}
Run Code Online (Sandbox Code Playgroud)

更新:

2)设置delegate为可选

class SecondVC: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {
    var delegate: SendDataDelegate?
    ...

    func pickerView (pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        var text = arr[row]
        dispatch_async(dispatch_get_main_quene(), {
            self.delegate?.sendData(text)
        )}
    }
Run Code Online (Sandbox Code Playgroud)