【问题标题】:How to access one UIViewControllers properties from another UIViewController?如何从另一个 UIViewController 访问一个 UIViewControllers 属性?
【发布时间】:2011-02-15 22:55:52
【问题描述】:

我有一个 MainViewController 当然它是一个主 UIView。我的主视图由许多不同的子视图组成。

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

假设 MAIN 视图(其委托主要是 MainViewController)有一个容器,该容器加载另一个 UIView,该 UIView 使用单独的 UIViewController-SecondaryViewController 作为大多数操作的委托.

这个容器视图当然是通过

加载到MainViewController中的
MyContainerViewController *myContainerController = 
         [[MyContainerViewController alloc] ...]; 
[self addSubView: myContainerController.view];

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

这有意义吗?我假设将涉及某种类型的转换,因为我似乎需要以某种方式在 SecondaryViewController 中保留对 MainViewController 的引用?

【问题讨论】:

    标签: iphone cocoa-touch ios4 uiviewcontroller uinavigationcontroller


    【解决方案1】:

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

    所以: 在 SecondaryViewController 中制作协议。 让 MainViewController 成为 SecondaryViewController 的委托。 在 MainViewController 中实现推送新 ViewController 的委托方法。

    【讨论】:

    • err 我认为这是我想做的方法。我想我需要阅读有关创建协议和为视图控制器正确创建委托的内容。使用 Interface Builder 似乎不容易做到这一点。
    • 至少你可以使代理成为一个 IBOutlet,这将使 MainViewController 更容易成为 SecondaryViewController 的代理(这仅在从其 NIB 加载 MainViewController 时应该存在 SecondaryViewController 时才相关)
    【解决方案2】:

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

    将您的根视图控制器公开为您的应用委托的属性,并同时合成它们。

    当你想访问不同的 UIViewController 时,首先获取对你的 appDelegate 的引用:

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

    然后只需使用您的属性链来访问您想要的视图控制器。

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

    有些人不赞成使用 sharedApplication 类方法来获取对委托的引用,但我已经在多个应用程序中使用过它并且(还)没有受到影响。另一种方法是通过 viewController 的层次结构来管理 appDelegate。

    【讨论】:

    • 很抱歉这么说,但这会让SecondaryViewController知道MainViewController的实现,实际上是它的父级。糟糕的代码设计。
    • 不 - MainViewController 知道 SecondaryViewController,但 Secondary 不知道 Main。 (所有引用都指向“向下”)。
    • 您使用您的委托作为对象。您假设您的应用程序委托具有 UIViewController 类型的变量。这是错误的,因为 UIApplicationDelegate 是一个协议并且具有它符合的方法。不是实例变量。见:developer.apple.com/library/ios/#documentation/uikit/reference/…。当你使用你的委托作为对象时,正如我之前的帮助,你将有一个“向上”的参考。
    猜你喜欢
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 2017-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多