代表仍然为零

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 on 其视图不在窗口层次结构中! 你碰巧知道它是什么?【参考方案2】:

要成功配置 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()`方法。

以上是关于代表仍然为零的主要内容,如果未能解决你的问题,请参考以下文章

代表为零,使用故事板嵌入segue

在 didSelectItemAt 中,单元格的代表为零

尝试从父级 IOS swift 3 中删除子级时,我的代表为零

代表仍然是零

为什么“不为零”在Lua中归零?

自定义协议委托为零