2016-03-24 95 views
0

我學習迅速協議和委託pattern.But,我真的需要用下面的問題,幫助其返回我空結果斯威夫特代表和協議

在視圖控制器1:

protocol GetAllDataProtocol{ 
    func didReadInfo(info : [[String:String]]) 
} 
class ViewController1 : { 
    var delegate : GetAllDataProtocol? 
    var info_data : [[String:String]] = [] 

    override func viewDidLoad() { 

     readData() 
    } 

    func readData(){ 
     info_data.append(["ID" :"234FD","ADDRESS":"Maimi","TYPE":"A"]) 
     delegate?.didReadInfo(info_data) 
    } 
} 

然後在視圖控制器2 :

class SubmissionViewController: UIViewController,UIPickerViewDataSource,UIPickerViewDelegate,GetAllDataProtocol{ 
     var info_data = [[String:String]]() 

     @IBAction func submitTapped(sender: AnyObject) { 
      print("After : \(info_data)") 
     } 

     func didReadInfo(info: [[String : String]]) { 
      dispatch_async(dispatch_get_main_queue(),{ 
       self.info_data = info 
       print("Before : \(self.info_data)") 
      }) 
     } 
} 

當運行

After : [] 

爲什麼它沒有運行「之前?」以及爲什麼我無法獲取數據。

+0

何時/你在哪裏設置代表? 'x.delegate = y'? – Wain

+0

對不起,延遲迴復,我有點忙於工作。實際上,我使用uitabbarcontroller.i只是想將一個數據從一個標籤傳輸到另一個標籤。 –

回答

1

SubmissionViewController應該在ViewController1上有引用。在viewDidLoad()方法中,將viewController.delegate分配給self。

代碼:

class SubmissionViewController: UIViewController,UIPickerViewDataSource,UIPickerViewDelegate,GetAllDataProtocol{ 
    var info_data = [[String:String]]() 
    var viewController1:ViewController1? 

    override func viewDidLoad() { 
     //You should here load viewController1 or connect it by outlet in above 
     let storyboard = UIStoryboard(name: "MyStoryboardName", bundle: nil) 
     viewController1 = storyboard.instantiateViewControllerWithIdentifier("ViewController1") as? ViewController1 
     self.viewController1!.delegate = self 
    } 
    @IBAction func submitTapped(sender: AnyObject) { 
     print("After : \(info_data)") 
    } 

    func didReadInfo(info : [[String:String]]) { 
     dispatch_async(dispatch_get_main_queue(),{ 
      self.info_data = info 
      print("Before : \(self.info_data)") 
     }) 
    } 
} 
+0

我會試一試...感謝您的幫助 –

1

您沒有設置委託的引用作爲艾哈邁德Lotfy解釋。

也許你錯過了協議只是一種模板或承諾。所以,如果你定義一個協議與功能

func didReadInfo(info : [[String:String]]) 

你說「嘿,每一個符合協議XYZ類應該已經實現了這個方法。」通過在應該符合協議「GetAllDataProtocol」的「ViewController1」類上聲明委託變量,您只需確保可以在該對象上調用函數「didReadInfo」。但這個變量沒有設置在任何地方,這就是爲什麼你的電話

delegate?.didReadInfo(info_data) 

沒有效果。 「委託?」的可選鏈接。不成功,並且函數「didReadInfo」永遠不會被調用。