菜鸟教程小白 发表于 2022-12-11 19:25:33

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


                                            <p><p>我对使用 Xcode/Swift 编程还很陌生,但遇到了一个小问题。</p>

<p>我想使用委托(delegate)将信息从 ViewController 发送到第二个 ViewController 并且不使用 segue。我对此进行了很多阅读,发现最常见的解决方案是在 ViewDidLoad 中使用“instance”.delegate = self,但它对我不起作用。 </p>

<p>-- 应用定义--</p>

<p>这很容易。在第一个 ViewController 上,我有一个按钮和一个标签。该按钮打开第二个 ViewController,它有一个 textField 和一个 Button。 Button 将 textField 中的内容发送到第一个 ViewController 以更新 Label。</p>

<p>-- 代码--</p>

<p>这是第一个 ViewController 的代码:</p>

<pre><code>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
    }
}
</code></pre>

<p>这是第二个 ViewController 的代码:</p>

<pre><code>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)
      }
    }
}
</code></pre>

<p>使用此代码不会发生任何事情,因为在 SecondViewController 中委托(delegate)始终为零。</p>

<p>你能帮忙吗?</p>

<p>提前谢谢你!</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>实际上我的原始代码更复杂。我试图通过一个更简单的练习来“减少问题”,以便更好地了解如何在有和没有 Segues 的情况下传递信息。</p>

<p>我将两个 ViewController 与 Segue 连接(见图)。 </p>

<p> <a href="/image/cwbn0.png" rel="noreferrer noopener nofollow"><img src="/image/cwbn0.png" alt="Layout"/></a> </p>

<p>到目前为止,我发现了两种在这里有效的传递信息的方法:</p>

<ol>
<li><p>Segue:通过Segue连接两个ViewController并使用prepare(for segue),如下例,然后使用协议(protocol)函数:</p>

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

<pre><code>//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: &#34;GetData&#34;) as! ViewController
    self.present(firstVC, animated: true)
    firstVC.Label.text = text_to_pass
}
</code></pre> </li>
</ol>

<p>这两个选项都可以,但我想了解为什么上面的代码不起作用。我阅读了很多文章,大多数人都在 ViewDidLoad 中使用 secondView.delegate = self 并像魅力一样工作。</p>

<p>我做错了什么?</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 在没有 segue 的 2x ViewControllers 之间传递信息时,Delegate 总是为零,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/47735120/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/47735120/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 在没有 segue 的 2x ViewControllers 之间传递信息时,Delegate 总是为零