2016-12-09 12 views
0

私はこれをうまくやってみることを何度も試みましたが、無駄です。 SendingVCからReceivingVCに配列を渡して、その配列の内容を2つのラベルに表示しようとしています。プロトコル/デリゲートを使用して配列を渡す

SendingVCコード:

import UIKit 

protocol SenderVCDelegate { 
    func passArrayData(data: [String]) 
} 

class SendingVC: UIViewController { 

    // DELEGATE 
    var delegate: SenderVCDelegate? 

    var carDetails: [String]? = ["BMW", "X5"] 

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

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

    @IBAction func unwindToFirst(segue: UIStoryboardSegue) { 
     // 
    } 

    override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool { 
     if (carDetails?.isEmpty)! { 
      return false 
     } else { 
      if let delegate = delegate, let data = carDetails { 
       delegate.passArrayData(data: data) 
       print("from inside segue: \(data)") 
      } 

      return true 
     } 
    } 
} 

ReceivingVCコード

import UIKit 

class ReceivingVC: UIViewController, SenderVCDelegate { 
    @IBOutlet weak var lbl01: UILabel! 
    @IBOutlet weak var lbl02: UILabel! 

    var incomingCarDetails: [String] = [] 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     print("from inside viewLoad: \(incomingCarDetails)") 
    } 

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

    override func prepare(for segue: UIStoryboardSegue, sender: Any?){ 
     if let sendingVC: SendingVC = segue.destination as? SendingVC { 
      sendingVC.delegate = self 
     } 
    } 

    func passArrayData(data: [String]) { 
     incomingCarDetails = data 

     populateLabels(array: incomingCarDetails) 
    } 

    func populateLabels(array: [String]) { 
     for (index, value) in array.enumerated() { 
      switch index { 
      case 0: 
       lbl01.text = value 
      case 1: 
       lbl02.text = value 
      default: 
       break 
      } 
     } 
    } 
} 

任意の助けいただければ幸いです! :)

ありがとう!

+1

このために代理人は必要ありません。 'preparaForSegue'のプロパティを設定するだけです – Paulw11

+0

ありがとうございますが、私はこのために代理人を使いたいと思います。 – halkibsi

+1

あなたは依然として 'prepareForSegue'でデリゲートを設定する必要がありますが、実際には意味がありません。 'SendingVC'の関数を呼び出して' SendingVC'から返された配列を取得できるようにする 'ReceivingVC'のインスタンスにプロパティを設定しようとしています。 「ReceivingVC」の配列プロパティを設定して終了するのはなぜですか? – Paulw11

答えて

1

デリゲートの役割とその実装場所を混乱させるようです。 SendingVCからRecevingVCにデータを渡すためにデリゲートを使用する必要はありませんが、宛先ビューコントローラのプロパティを単にprepareForSegueに設定することができます。

class SendingVC: UIViewController { 

    func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if let destVC = segue.destinationViewController as? ReceivingVC { 
      destVC.incomingCarDetails = self.carDetails 
     } 
    } 
} 

データを受け入れるのではなく、あなたが、デリゲートを使用したいん場合は、prepareForSegueであなたのReceivingVCのデリゲートとしてSendingVCインスタンスを設定し、デリゲートメソッドは、データを返すように、あなたのプロトコルを変更します。

protocol SenderVCDelegate { 
    func passArrayData() -> [String] 
} 

その後、あなたはデリゲートメソッドを実装し、prepareForSegue

class SendingVC: UIViewController, SenderVCDelegate { 

    func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if let destVC = segue.destinationViewController as? ReceivingVC { 
      destVC.senderDelegate = self 
     } 
    } 

    func passArrayData() -> [String] { 
     return self.carDetails 
    } 
} 
にデリゲートを設定することができますあなたは、これが全体の多くの作品と無利益で見ることができるようにあなたがviewWillAppear

class ReceivingVC: UIViewController { 

    var incomingCarDetails = [String]() 
    var senderDelegate: SenderVCDelegate? 

    override func viewWillAppear(animated: bool) { 
     super.viewWillAppear(animated) 

     if let incomingDetails = self.senderDelegate?.passArrayData() { 
      self.incomingCarDetails = incomingDetails 
     } 
    } 
} 

にデリゲートメソッドを呼び出すことができますReceivingVCで210

。委譲パターンは通常、データに送信し、ネットワーク操作の完了やユーザーの操作に応答して、予期せぬ時間に関数呼び出しが行われる場所で使用されます。

+0

ありがとうございました! – halkibsi

関連する問題