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

时间:2014-12-01 18:46:20

标签: ios swift delegates uicontainerview

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

所以我想要的如下:

  1. CollectionViewCell点击,触发segue到TableVC
  2. TableVC接收信息并更新表格
  3. TableVC在第三个VC中触发委托功能
  4. 第三个VC接收一些信息和更新视图
  5. 在上面我已经设法让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 :(得分: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
        }
    }
}

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