我正在学习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 : []
为什么它之前没有运行?以及为什么我无法获得数据。
答案 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"永远不会被称为。