Iphone 如何从另一个UIViewController访问一个UIViewController属性?

Iphone 如何从另一个UIViewController访问一个UIViewController属性?,iphone,cocoa-touch,ios4,uiviewcontroller,uinavigationcontroller,Iphone,Cocoa Touch,Ios4,Uiviewcontroller,Uinavigationcontroller,我有一个单一的主视图控制器,它当然有一个主视图。我的主视图由许多不同的子视图组成 其中一些子视图有自己的ViewController SubSubViewController* ssvc = myAppDelegate.rootViewController.subViewController.subSubViewController; 假设主视图(其委托主要是MainViewController)有一个容器,该容器加载另一个UIView,该UIView使用单独的UIViewController

我有一个单一的主视图控制器,它当然有一个主视图。我的主视图由许多不同的子视图组成

其中一些子视图有自己的ViewController

SubSubViewController* ssvc = myAppDelegate.rootViewController.subViewController.subSubViewController;
假设主视图(其委托主要是MainViewController)有一个容器,该容器加载另一个UIView,该UIView使用单独的UIViewController-SecondaryViewController作为其大多数操作的委托

当然,此容器视图通过以下方式加载到MainViewController中:

myContainerController.view的控制器是MyContainerViewController。如何在此控制器内访问MainViewController属性?具体来说,我需要访问MainViewController的-self.navigationController属性以推送新的ViewController?:)


这有什么意义吗?我假设会涉及到某种类型的强制转换,因为似乎我需要在SecondaryViewController中保留对MainViewController的引用

将所需的子视图控制器公开为包含它们的视图控制器的属性

将根视图控制器作为应用程序代理的属性公开,并将其合成

如果要访问其他UIViewController,请首先获取对appDelegate的引用:

MyAppDelegate* myAppDelegate = [[UIApplication sharedApplication] delegate];
然后,只需使用属性链即可访问所需的视图控制器

SubSubViewController* ssvc = myAppDelegate.rootViewController.subViewController.subSubViewController;

有些人不赞成使用sharedApplication类方法来获取对委托的引用,但我已经在多个应用程序中使用过它,而且(目前)还没有受到影响。另一种方法是将appDelegate通过视图控制器的层次结构进行管道传输。

从MainViewController中的SecondaryViewController推送一个新的ViewController是没有意义的。 这破坏了代码的设计。子对象将访问其父方法以调用方法。换句话说:糟糕的代码。 从SecondaryViewController向其状态已更改的MainViewController进行委托调用。然后MainViewController可以决定如何处理该调用,而SecondaryViewController将不知道有关MainViewController实现的任何信息

SubSubViewController* ssvc = myAppDelegate.rootViewController.subViewController.subSubViewController;
因此: 在SecondaryViewController中创建协议。 让MainViewController成为SecondaryViewController的委托。
在MainViewController中实现委托方法,该方法将推送新的ViewController。

很抱歉这样说,但这会使SecondaryViewController知道MainViewController的实现,而MainViewController实际上是其父级。错误的代码设计。不-MainViewController知道SecondaryViewController,但Secondary不知道Main。(引用的所有点均为“向下”)。您可以将委托用作对象。假设应用程序委托具有UIViewController类型的变量。这是错误的,因为UIApplicationLegate是一个协议,并且有它所遵循的方法。不是实例变量。请参阅:。当您使用委托作为对象时,正如我前面所说,您将有一个“向上”的引用。呃,我想这是我想要的方法。我想我需要阅读有关创建协议和为视图控制器正确创建代理的内容。似乎无法使用Interface Builder轻松完成此操作。至少可以将代理设置为IBOutlet,这样可以更轻松地将MainViewController设置为SecondaryViewController的代理(这仅在从其NIB加载MainViewController时SecondaryViewController应该存在时才相关)
SubSubViewController* ssvc = myAppDelegate.rootViewController.subViewController.subSubViewController;