带委托的多个容器视图

时间:2018-12-07 04:19:02

标签: ios delegates segue uicontainerview

我有一个包含2个容器视图的View控制器。其中一个具有滚动视图,其中一个只是一个小视图。

现在,我想在所有3个对象之间进行通信,我的方式是使用主ViewController作为其他2个对象的委托。我本来不知道如何将它们设置为委托,因为没有过渡或其他演示文稿(就在那里)

几个月前在这里问完之后,我得到了以下答案:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if (segue.identifier == "embedSegue") {
        resultsVC = (segue.destination as! GoalsVC)
        resultsVC.calcDelegate = self
    }
}

但是,我不知道如何对两个视图都执行此操作。它们都使用相同的segue,所以我不能让它们都具有相同的ViewController。

我当时正在考虑使用情节提要ID,但如何在prepareforsegue中引用它们? 会是

if (segue.identifier == "embedSegue" && storyboardidentifier = "myVC1") {
    resultsVC = (segue.destination as! GoalsVC)
    resultsVC.calcDelegate = self
} else if (segue.identifier == "embedSegue" && storyboardidentifier = "myVC2") {
    otherVC = (segue.destination as! NewVC)
    resultsVC.calcDelegate = self
}

除了我不知道引用情节提要的确切代码

1 个答案:

答案 0 :(得分:0)

如果使用?代替 !您可以使用转换成功来表明您是否具有正确的ViewController。代码如下

if segue.identifier == "embedSegue" {
    if let resultsVC = segue.destination as? GoalsVC {
        resultsVC.calcDelegate = self
    }
    if let otherVC = segue.destination as? NewVC {
        resultsVC.calcDelegate = self
    }
}

通过委托的设置,您可以进一步简化此代码。设置一个新的委托,确保您的两个嵌入式ViewController符合该委托。在下面的代码中,我假设您已经编写的委托称为CalcDelegate。

protocol CalcDelegateDelegate {
    var calcDelegate : CalcDelegate? {get set}
}

class GoalsVC : UIViewController, CalcDelegateDelegate {
    var calcDelegate: CalcDelegate? = nil
}

class NewVC : UIViewController, CalcDelegateDelegate {
    var calcDelegate: CalcDelegate? = nil
}

然后将您的准备代码简化为

if segue.identifier == "embedSegue" {
    if var delegate = segue.destination as? CalcDelegateDelegate {
        delegate.calcDelegate = self
    }
}

嵌入在主控制器中的任何新视图控制器都只需符合委托,它会自动获取calcDelegate并可以与其他视图控制器进行通信。