使用协议传递数据

时间:2015-12-31 08:49:52

标签: ios swift protocols

我已阅读Trying to understand protocol/delegates in SwiftPassing data back from view controllers XcodePass data when dismiss modal viewController in swift,试图来回传递一些数据。我想我确实完成了帖子描述的内容,数据没有被传递。我错过了什么,我不知道是什么。如果你能指出那是什么,那就太棒了。提前谢谢你:)

我还应该提到我使用模态segue呈现了TaskMessageViewController。我想将数据发送回TaskListViewController。我目前正在使用unwindToSegue返回TaskListViewController

在我的Protocols.swift文件中,我有以下代码:

import Foundation

protocol ReceiveMessageDelegate {
    func receiveMessageFromTaskMessageViewController (message: String)
}

在我的继承声明中,我有:

class TaskListViewController: UIViewController, ReceiveMessageDelegate

在我的TaskListViewController.swift中,我写道:

override func viewDidLoad() {
    super.viewDidLoad()

    let taskMessageViewController = TaskMessageViewController()
    taskMessageViewController.delegate = self

}

func receiveMessageFromTaskMessageViewController (message: String) {
    print(message)
    print("Protocol works!")
}

在我的TaskMessageViewController.swift中,我写道:

var delegate: ReceiveMessageDelegate?
@IBAction func doneButtonTapped(sender: AnyObject) {
    self.delegate?.receiveMessageFromTaskMessageViewController("message from message View Controller")
}

当我按下模拟器上的done按钮时,doneButtonTapped会被执行。但是,print("Protocol Works")永远不会被执行。有人有什么建议吗?

2 个答案:

答案 0 :(得分:1)

如果要在swift中的视图控制器之间传递消息,通常不需要创建自己的协议。如果您在解除模态视图控制器时尝试传递数据,通常可以通过识别segue的源视图控制器来识别所呈现的视图控制器并访问其属性。

在这种情况下,消息未被打印的原因是因为您要将self分配给实例的委托" taskMessageViewController"这是viewDidLoad()方法的局部常量,而taskMessageViewController永远不会转义viewDidLoad()。你永远不会设置自己的代表。

答案 1 :(得分:0)

我再次阅读你的问题。我看到你正在使用unwind segue。所以你不需要委托来传回消息。你应该这样做:

TaskMessageViewController.swift中,定义变量message,并覆盖函数prepareForSegue

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "identifierUnwind" {
        message = message
    }
}

而你的TaskListViewController.swift,你可以得到它:

@IBAction func unwindToSegue (segue : UIStoryboardSegue) {
      if let taskMessageViewController = segue.sourceViewController as? TaskMessageViewController 
         print(taskMessageViewController.message)
         //OR save and do anything with it here.
      } 
 }