我有一个包含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
}
除了我不知道引用情节提要的确切代码
答案 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并可以与其他视图控制器进行通信。