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

问题描述:

我有一个单一的MainViewController,当然它是一个主要的UIView。我有这个主视图由许多不同的子视图组成。如何从另一个UIViewController访问一个UIViewControllers属性?

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

比方说在主要视图(其代表主要是MainViewController)具有加载使用一个单独的UIViewController- SecondaryViewController为代表的大多数IT的行动另一个UIView的容器。

该容器视图经由

MyContainerViewController *myContainerController = 
     [[MyContainerViewController alloc] ...]; 
[self addSubView: myContainerController.view]; 

当然在加载MainViewController用于myContainerController.view控制器虽然是MyContainerViewController。如何在该控制器内部访问MainViewController属性?具体而言,我需要访问MainViewController的 - self.navigationController属性来推送一个新的ViewController? :)

这是否有任何意义?我认为会有一些涉及的铸造,因为它似乎我需要以某种方式保留在SecondaryViewController内的MainViewController的引用?

从MainViewController的SecondaryViewController中推入一个新的ViewController是没有意义的。 这就搞砸了代码的设计。一个子对象将访问其父项方法来调用一个方法。换句话说:糟糕的代码。 进行从SecondaryViewController到其状态已更改的MainViewController的委托调用。然后,MainViewController可以决定如何处理这个调用,并且SecondaryViewController不会知道任何关于MainViewController的实现。因此: 在SecondaryViewController中创建一个协议。 让MainViewController成为SecondaryViewController的委托。 在推送新ViewController的MainViewController中实现委托方法。

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

将您的根视图控制器公开为您的应用程序委托的属性,并对其进行合成。

当你要访问一个不同的UIViewController,首先获得您的appDelegate参考:

MyAppDelegate* myAppDelegate = [[UIApplication sharedApplication] delegate]; 

然后,只需用你的属性链到你想要的视图控制器的访问。

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

有些人看不惯使用sharedApplication类的方法来获得参考,以委托的,但我已经用它在多个应用程序,而不是遭受它(还)。另一种方法是通过你的viewControllers层次来管你的appDelegate。

+0

不好意思这么说,但是这使得SecondaryViewController知道MainViewController的实现,它实际上是它的父类。错误的代码设计。 – 2011-02-15 23:05:38

+0

不 - MainViewController知道SecondaryViewController,但Secondary不知道Main。 (参考文献都指向“向下”)。 – 2011-02-15 23:15:41