我正在尝试使用委托将数据从一个ViewController发送到另一个ViewController,但似乎无法获得正确的实例
我尝试在包含ViewDidLoad的接收ViewController中的不同位置设置委托,但是发送ViewController中的委托始终为nil。
从我学到的知识来看,这似乎是每个人都会遇到的一个普遍问题,我已经阅读了很多样本,尝试了一下,但无济于事。我不知道我是否遗漏了一些东西。如果可以的话,请说明一下。
下面是我最终得到的结果。
正在发送的ViewController:
protocol CreateChatDelegate: class{
func appendChatData(_ sender: CreateChatViewController)
}
class CreateChatViewController: UIViewController {
weak var delegate: CreateChatDelegate!
@IBAction func createChat(_ sender: AnyObject) {
delegate?.appendChatData(self)
if delegate == nil {
print("delegate unsuccessful")
} else {
print("delegate successful")
}
}
接收ViewController:
class ViewController: UIViewController{
var createChatViewController: CreateChatViewController!
override func viewDidLoad() {
super.viewDidLoad()
...
}
}
extension ViewController: CreateChatDelegate {
func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
// get the reference to the ViewController
self.createChatViewController = segue.destination as? CreateChatViewController
// set it as delegate
self.createChatViewController?.delegate = self
print("ViewController: delegate successful")
}
}
func appendChatData(_ sender: CreateChatViewController) {
print("ViewController: CreateChatDelegate called")
}
}
此代码输出“委托失败”,因为委托始终为零
答案 0 :(得分:0)
要成功配置segue,您需要确保
1-导航由
触发self.performSegue(withIdentifier:"segue",sender:nil)
2-强制展开
self.createChatViewController = segue.destination as! CreateChatViewController
由于某些原因,as?
强制转换可能会失败
答案 1 :(得分:0)
首先请确保调用prepareForSegue()方法。然后确保为CreateChatViewController即调用它,即
if let destination = segue.destination as? CreateChatViewController {
//Do all the stuff there e.g.
destination.delegate = self
}
如果未调用您的prepareForSegue()方法,请正确设置操作,以便它将触发prepareForSegue()方法,然后您将在CreateChatViewController中获得委托值。
答案 2 :(得分:0)
您使用的方法不正确。您应该使用新的:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
....
}
是否注意到override
关键字?如果您在编写viewController方法时没有看到此消息,则意味着您没有在调用原始方法并且没有错误拼写函数签名。
注意::如果您要定位的是较旧的iOS,并且使用的是较旧的Xcode,则方法名称可能会有所不同,您应编写该方法的名称,并让 AutoComplete 帮助正确的人。