0

こんにちは、最近、コースでプロトコルとデリゲートに出くわしました(ここで本番環境のiOS開発者)。

基本的に何もしない単純なアプリでこれを適用しようとしましたが、ある VC から別の VC にデータを渡したいと思いました。

より具体的には、ViewControllerOne にはボタンがあり、ViewControllerTwo に移動するためのセグエを設定します。ViewControllerTwo には、ViewControllerTwo のボタンをクリックしたときにテキストを印刷するだけのボタンもあります。

コードは次のとおりです。

レシーバー

    class ViewControllerOne: UIViewController, DataDelegate {
      var vcTwo = ViewControllerTwo()        

      override func viewDidLoad() {
       super.viewDidLoad()
    
      vcTwo.delegate = self
      }
    
      func printThisNumber(type: Int){
        print("This is a test of delegate with number: \(type)")
      }
    

プロトコルが定義された送信者

protocol DataDelegate {
  func printThisNumber(type: Int)
}

class ViewControllerTwo: UIViewController {

  var delegate: DataDelegate?

  override func viewDidLoad() {
    super.viewDidLoad()
  }



  @IBAction func myButtonPressed(_ sender: UIButton) {
     delegate?.printThisNumber(type: 1)

  }
}

何も送信せず、明らかに(ボタンをクリックしたときに)printステートメントでnilを表示してトラブルシューティングを試みましたが、viewDidLoadでデリゲートを出力してもnilが表示されます。

デリゲートを弱い変数として宣言するなど、StackOverflow から別のアプローチを試みたとき、Xcode ではそうすることさえできませんでした。

この問題に時間を費やし、私がそれを理解または解決するのに役立つものを提案してくれる人に感謝します.

それが整理される場合、私の将来の意図は、VCTwo でいくつかのデータを取得し、そのデータで更新することです。たとえば、VCOne のラベル テキストです。

よろしくお願いしますペトル

4

1 に答える 1

1

への移動にセグエを使用しているためViewControllerTwo、 のvcTwoインスタンスViewControllerOneはプッシュされた View Controller インスタンスにはなりません。のそのインスタンスにアクセスするには をオーバーライドprepare(for segueしてから、デリゲートを設定する必要があります。ViewControllerOneViewControllerTwo

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let vcTwo = segue.destination as? ViewControllerTwo {
        vcTwo.delegate = self
    }
}
于 2020-08-07T15:49:42.627 に答える