代表仍然为零
Posted
技术标签:
【中文标题】代表仍然为零【英文标题】:delegate remains nil 【发布时间】:2019-06-10 10:15:35 【问题描述】:我正在尝试使用委托将数据从一个 ViewController 发送到另一个,但似乎无法获得正确的实例
我尝试在接收 ViewController 中的不同位置设置委托,包括 ViewDidLoad,但发送 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")
接收视图控制器:
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")
这段代码输出“delegate unsuccessful”,因为delegate总是nil
【问题讨论】:
print(type(of: segue.destination))
inside prepareForSegue...
看看目标类型是什么。
谢谢。如果一开始没有调用prepareForSegue
,我该怎么办?我注意到这似乎是问题所在。
你使用什么 ios 和 Xcode 版本?
检查答案。
【参考方案1】:
您使用的方法不正确。您应该使用新的:
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
....
注意到override
关键字了吗?如果您在编写 viewController 方法时没有看到这一点,则表示您没有调用原始方法并且拼错了函数签名。
注意:如果您针对的是旧版 iOS 并使用旧版 Xcode,方法名称可能不同,您应该写下方法名称并让 AutoComplete 帮助你选对了。
【讨论】:
是的!我对此很好奇,对于完全相同的事情有两种不同的方法。我已将其更改为override func prepare(for segue: UIStoryboardSegue, sender: Any?)
,segue 似乎终于被调用了。现在我需要做的就是打电话给func appendChatData
成功了!非常感谢你!!!我只有一个担心。没有错误,但我收到了以下警告:Warning: Attempt to present 要成功配置 segue,您需要确保
1- 导航由
触发self.performSegue(withIdentifier:"segue",sender:nil)
2- 强制展开
self.createChatViewController = segue.destination as! CreateChatViewController
as?
演员可能由于某种原因静默失败
【讨论】:
非常感谢您的帮助。因此,我尝试将performSegue(withIdentifier:"segue",sender:nil)
放在viewDidLoad()
下,但我总是收到终止错误'Receiver (<.viewcontroller: ... has no segue with identifier>。
我通过 Main.storyboard 将 segue 命名为“segue”。我是不是走错路了?
把它放在viewDidAppear
中进行测试,并在故事板中用你自己的名字替换segue
谢谢,我在viewDidAppear
也试过了,结果一样。我认为这里的withIdenifier:
指的是“Storyboard segue”中的“标识符”框,我没有误会吗?因为我不断得到 'Receiver (<.viewcontroller: ... has no segue with identifier>【参考方案3】:
首先确保调用了 prepareForSegue() 方法。然后确保它是为 CreateChatViewController 调用的,即
if let destination = segue.destination as? CreateChatViewController
//Do all the stuff there e.g.
destination.delegate = self
如果您的 prepareForSegue() 方法未被调用,则正确设置操作,以便触发 prepareForSegue() 方法,然后您将在 CreateChatViewController 中获得委托值。
【讨论】:
感谢您的回复。好像没有调用`prepareForSegue()`方法。以上是关于代表仍然为零的主要内容,如果未能解决你的问题,请参考以下文章