我有一个MainViewController,它当然是一个主要的UIView。我有这个主视图包含许多不同的子视图。
其中一些子视图有自己的ViewController。
让我们说 MAIN 视图(其委托主要是MainViewController)有一个容器,它加载另一个UIView,它使用一个单独的UIViewController- SecondaryViewController 作为大多数动作的委托
此容器视图当然通过
加载到 MainViewController 中MyContainerViewController *myContainerController =
[[MyContainerViewController alloc] ...];
[self addSubView: myContainerController.view];
myContainerController.view的控制器虽然是 MyContainerViewController 。我在这个控制器中如何访问MainViewController属性?具体来说,我需要访问MainViewController的 - self.navigationController属性来推送一个新的ViewController? :)
这有什么意义吗?我假设有一些涉及的类型,因为我似乎需要以某种方式保留对SecondaryViewController内的MainViewController的引用?
答案 0 :(得分:2)
从MainViewController中的SecondaryViewController推送新的ViewController是没有意义的。 这搞砸了代码的设计。子对象将访问其parent方法以调用方法。换句话说:糟糕的代码。 从SecondaryViewController到其状态已更改的MainViewController进行委托调用。然后MainViewController可以决定调用,而SecondaryViewController也不会知道MainViewController的实现。
所以: 在SecondaryViewController中创建一个协议。 让MainViewController成为SecondaryViewController的委托。 在MainViewController中实现委托方法,该方法推送新的ViewController。
答案 1 :(得分:0)
将所需的子视图控制器公开为包含它们的视图控制器的属性。
将您的根视图控制器公开为您的应用委托的属性,并将它们合成。
如果要访问其他UIViewController,请首先获取对appDelegate的引用:
MyAppDelegate* myAppDelegate = [[UIApplication sharedApplication] delegate];
然后只需使用您的属性链即可访问所需的视图控制器。
SubSubViewController* ssvc = myAppDelegate.rootViewController.subViewController.subSubViewController;
有些人不赞成使用sharedApplication类方法来获取对委托的引用,但我已经在多个应用程序中使用它并且没有受到影响(尚未)。另一种方法是通过viewControllers层次结构管道你的appDelegate。