我正在学习快速协议(protocol)和委托(delegate)模式。但是,我真的需要帮助解决以下返回空结果的问题
在 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 : []
为什么它“之前”没有运行?以及为什么我无法获取数据。
最佳答案
SubmissionViewController 应该在 ViewController1 上有引用。在 viewDidLoad() 方法中将 viewController.delegate 分配给自己。
代码:
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)")
})
}
}
关于Swift 委托(delegate)和协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36196424/