代表仍为零

时间:2019-06-10 10:15:35

标签: ios swift delegates segue

我正在尝试使用委托将数据从一个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")
    }

}

此代码输出“委托失败”,因为委托始终为零

3 个答案:

答案 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 帮助正确的人。