Swift代表和协议

时间:2016-03-24 09:03:06

标签: swift delegates protocols

我正在学习swift协议和委托模式。但是,我真的需要帮助解决以下问题,这些问题会给我带来空洞的结果

在ViewController 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)
     }
}

然后在ViewController 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 : []

为什么它之前没有运行?以及为什么我无法获得数据。

2 个答案:

答案 0 :(得分: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)")
        })
    }
}

答案 1 :(得分:1)

你并没有像Ahmed Lotfy所说的那样设定代表的参考。

也许你错过了协议只是一种模板或承诺的观点。因此,如果您使用您的函数定义协议

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

你说"嘿,每个符合XYZ协议的类都应该实现这个方法。"并通过在" ViewController1"上声明委托变量应该符合协议的类#34; GetAllDataProtocol",你只需要确保你可以调用函数" didReadInfo"在那个对象上。但是这个变量没有设置在任何地方,这就是为什么你的电话

delegate?.didReadInfo(info_data)

无效。 "委托的可选链接?。"没有成功,功能" didReadInfo"永远不会被称为。