首页 文章

在容器中使用兄弟视图控制器之间的委托

提问于
浏览
1

我正在尝试制作一个使用三个容器来显示不同内容的应用程序,但我在容器之间进行通信时遇到问题 . 我成功地使用segue将一个容器中按钮的一些信息发送到另一个容器,但是这些信息的一部分也必须转发到第三个容器 . 为此,我想使用委托,但我不能将正确的ViewController引用到委托变量 .

所以我想要的如下:

  • CollectionViewCell点击,触发segue到TableVC

  • TableVC接收信息并更新表

  • TableVC在第三个VC中触发委托功能

  • 第三个VC接收一些信息和更新视图

在上面我已经设法让1和2工作,但卡在3 .

我的协议如下:

protocol PurchaseDelegate {
    func addToTotalAmount(product : Product)
}

在TableVC中我声明了 var delegate : PurchaseDelegate? = nil 并且在从segue触发的IBAction中: delegate?.addToTotalAmount(product)

在第三个VC我已经实现了如下代理:

class thirdVC:UIViewController,PurchaseDelegate {
    func addToTotalAmount(product : Product) {
        println("Adding....")
    }
}

所有三个容器都在一个主VC中,它在应用程序中执行一些初始化操作 .

我的问题是,我不知道如何在tableVC中从thirdVC获取引用到我的委托变量 .

提前致谢 .

1 回答

  • 0

    经过@Anna Dickinson的灵感进一步搜索后,我最终找到了问题的解决方案 .

    首先,必须在故事板中正确地订购容器 . 视图控制器实现委托协议的容器必须首先在列表中,然后是另一个视图控制器 .

    然后,在主视图控制器(具有容器的视图的视图控制器)中实现prepareForSegue函数,因为它将在容器初始化时被触发 .

    所有代码仍然如上所示,但主视图控制器将类似于以下内容:

    class MainViewController: UIViewController {
        var actionVC : FirstViewController! // This is the one, that implements the delegate protocol
        var tableVC : SecondViewController! // This is the one, that has a delegate variable
        override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
            if(segue.identifier == "firstVC"){
                self.actionVC = segue.destinationViewController as FirstViewController
            } else if(segue.identifier == "secondVC"){
                self.tableVC = segue.destinationViewController as SecondViewController
                self.tableVC.delegate = self.actionVC
            }
        }
    }
    

    我不确定这是否是正确的,也不是最好的方法,但它完全符合我的需要 .

相关问题