2017-12-10 13 views
2

Xcode/Swiftでプログラミングするのは初めてですが、小さな問題に直面しています。2人のViewControllersの間で情報を渡すときに代理人は常に0ではありません

デリゲートを使用し、segueを使用せずに、ViewControllerから2番目のViewControllerに情報を送信したいとします。私はそれについて多くを読んで、最も一般的なソリューションがViewDidLoadで "インスタンス" .delegate = selfを使用していることがわかりましたが、それは私のためにはうまくいきません。

- アプリケーションの定義 -

これはかなり簡単です。最初のViewControllerにはボタンとラベルがあります。ボタンは、2番目のViewControllerを開きます。このViewControllerには、textFieldとButtonがあります。 Buttonは、最初のViewControllerにtextFieldの内容を送信して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であるためです。

助けてください。

ありがとうございます!

+3

いつ、どのようにSecondViewControllerをプッシュしますか?そのコードを提供してください。 –

+0

次の行: 'var secondView = SecondViewController()'は、 'SecondViewController'のインスタンスをいくつか作成しています。 ** this **インスタンスに接続していますか?または、ストーリーボードのセグを使って 'SecondViewController'に到達しますか?その場合、**インスタンスへのポインタを作成し、 'var secondView = SecondViewController()'を避けなければなりません。 – Honey

+0

[この回答を見る](https://stackoverflow.com/a/31934786/) 5175709)とそれがリンクしているビデオ – Honey

答えて

0

実際に私の元のコードはより複雑です。私はSeguesの有無にかかわらず情報を渡す方法をよりよく理解するために、もっと簡単な演習で「問題を軽減する」ことを試みました。

両方のViewControllerをSegue(図を参照)に接続しています。セグエ

  1. Layout

    は、これまでのところ、私はここで働いて情報を渡すの二つの方法を発見したセグエで2 ViewControllersを接続することにより、以下の例のように、(セグエのための)準備を使用して、

    //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の新しいインスタンスを作成することによって、およびusinと、プロトコル機能を使用G Iは、コード例のように、第二ビューコントローラから必要な情報:

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

両方のオプションは、ここではOKですが、私は上記のコードが動作しない理由を理解したいです。私は多くの記事を読んで、ほとんどの人はViewDidLoad内でsecondView.delegate = selfを使っていて、魅力的に働いています。

私は間違っていますか?

関連する問題