在没有segue的2x ViewControllers之间传递信息时,委托总是为零

时间:2017-12-10 01:55:39

标签: ios delegates

我对使用Xcode / Swift编程很新,我遇到了一个小问题。

我想使用委托和没有segue将信息从ViewController发送到第二个ViewController。我读了很多关于它的内容,发现最常见的解决方案是在ViewDidLoad中使用“instance”.delegate = self,但它对我来说不起作用。

- App的定义 -

这很简单。在第一个ViewController上,我有一个按钮和一个Label。该按钮打开第二个ViewController,它有一个textField和一个Button。 Button将textField中的内容发送到第一个ViewController以更新Label。

- 代码 -

这是第一个ViewController的代码:

class ViewController: UIViewController, clickedButtonDelegate {

    @IBOutlet weak var Label: UILabel!

    func didClickedButton(text: String) {
        Label.text = text
    }

    var secondView = SecondViewController()

    override func viewDidLoad() {
        super.viewDidLoad()
        secondView.delegate = self
    }
}

这是第二个ViewController的代码:

protocol clickedButtonDelegate {
    func didClickedButton(text: String)
}

class SecondViewController: UIViewController {

    @IBOutlet weak var introducedText: UITextField!

    var delegate : clickedButtonDelegate!

    @IBAction func sendData(_ sender: Any) {
        if delegate != nil {
            let information:String = introducedText.text!
            delegate!.didClickedButton(text: information)
            dismiss(animated: true, completion: nil)
            self.navigationController?.popViewController(animated: true)
        }
    }
}

使用此代码没有任何反应,因为在SecondViewController中委托总是为nil。

你能帮忙吗?

提前谢谢!

1 个答案:

答案 0 :(得分:0)

实际上我的原始代码更复杂。我尝试用更简单的练习来“减少问题”,以便更好地理解如何使用和不使用Segues传递信息。

我将两个ViewControllers与Segue连接(见图)。

Layout

到目前为止,我找到了两种传递信息的方法:

  1. Segue:通过将两个ViewControllers与Segue连接并使用prepare(for segue),如下例所示,然后使用协议函数:

    //This piece of code goes inside the first ViewController
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "showSecondView" {
            let secondView: SecondViewController = segue.destination as! SecondViewController
            secondView.delegate = self
        }
    }
    
  2. 实例化:通过创建第一个ViewController的新实例并使用第二个View Controller中需要的信息,如示例代码中所示:

    //This piece of code goes inside the second ViewController
    @IBAction func sendData(_ sender: Any) {
        let text_to_pass = introducedText.text
    
        let firstVC = storyboard?.instantiateViewController(withIdentifier: "GetData") as! ViewController
        self.present(firstVC, animated: true)
        firstVC.Label.text = text_to_pass
    }
    
  3. 这两个选项都可以,但我想了解为什么上面的代码不起作用。我阅读了很多文章,大多数人都在ViewDidLoad中使用secondView.delegate = self,并且像魅力一样工作。

    我做错了什么?