Swift 委托(delegate)和协议(protocol)

标签 swift delegates protocols

我正在学习快速协议(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/

相关文章:

networking - Linux 网络堆栈 : adding protocols with an LKM and dev_add_pack

c# - 在 WCF 中序列化委托(delegate)

mysql - mysql协议(protocol)中的身份验证有多安全?

swift - 获取进程的所有打开文件导致 errno 12 = Out of Memory

json - 使用 Alamofire 快速写入 JSON 中的顶级类型无效

c# - 将枚举元素作为事件参数传递 C#

ios - 自定义委托(delegate)很快就为零

c - 嵌入式设备与远程服务器通信的协议(protocol)架构

ios - Swift - socket 无法连接到重复内容

ios - 如何在 AVPlayer 中强制横向模式?