我已阅读Trying to understand protocol/delegates in Swift,Passing data back from view controllers Xcode和Pass 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")
永远不会被执行。有人有什么建议吗?
答案 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.
}
}