在两个视图控制器之间传递数据(委托)- Swift

7

我有两个 ViewController

  1. FirstVC - I have label and button with segue "modal"

  2. SecondVC - I have PickerView and button (back to FirstVC):

    @IBAction func bntback(sender: AnyObject) {
              self.dissmissViewControllerAnimatied(true, completion: nil)
        }
    

我在 SecondViewController 中创建了代理,代码如下:

protocol SendDataDelegate {
   func sendData(text:String)
}

接下来:

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
     }

我的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"
  )}
}

首个视图控制器:

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
     }
 }

请帮我解决这个问题。

这个问题与IT技术有关。

var data = SecondVC() 无法工作,因为在 Interface Builder 中已经创建了 SecondVC 的实例。设置委托的常规方式是在 prepareForSegue 中。 - vadian
1个回答

8

1) 你需要在prepareForSegue中设置代理:

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

更新:

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)
        )}
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接