2016-12-09 61 views
0

我一直試着讓這個工作,但無濟於事。我正在嘗試從SendingVC傳遞數組到一個ReceivingVC,並在兩個標籤中顯示該數組的內容。使用協議/代理傳遞數組

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'中設置委託,但它確實沒有意義。你將在'ReceivingVC'的實例上設置一個屬性,使它能夠調用'SendingVC'上的函數來獲得從'SendingVC'返回的數組;爲什麼不在'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設置SendingVC實例作爲ReceivingVC的代表,改變你的協議,委託方法返回的數據,而不是接受數據:

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

ReceivingVC可以調用委託方法在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 
     } 
    } 
} 

正如你可以看到這是一個整體大量的工作,並沒有任何好處。通常在您想要發送數據的地方使用委託模式,並且其中函數調用將在不可預知的時間發生,例如響應網絡操作完成或用戶交互。

+0

非常感謝! – halkibsi