【问题标题】:How to get a UIViewController from a UIView via code [duplicate]如何通过代码从 UIView 获取 UIViewController [重复]
【发布时间】:2011-01-22 23:11:23
【问题描述】:

有办法从UIView 对象中获取视图控制器引用吗?我需要这样的东西:

MyParentViewController *myParentViewController = [self.view.superview controller];

【问题讨论】:

    标签: iphone objective-c cocoa-touch uiview uiviewcontroller


    【解决方案1】:

    UIView默认没有对UIViewController的引用。你可以将它添加到你的UIView子类中,并在你在UIViewController中创建UIView时设置它。

    如果您正在寻找 viewcontroller 的父级,每个 UIViewController 都有属性 parentViewController,但如果您想从 UIView 访问它,您需要先访问您的 UIViewController。

    您可以查看示例如何在 UIView 的子类中创建对 UIViewController 的引用以及如何/在哪里设置它 View Controller Programming guide for iPhone,请参阅定义中的以编程方式创建视图部分一个自定义视图控制器类,这里是示例,更多详细信息请参见链接的节拍器示例。

     - (void)loadView {
    
        self.wantsFullScreenLayout = YES;
    
        MetronomeView *view = [[MetronomeView alloc]
                              initWithFrame:[UIScreen mainScreen].applicationFrame];
        view.metronomeViewController = self;
        self.view = view;
        self.metronomeView = view;
    
        [view release];
    }
    

    在标题中:

    @interface MetronomeView : UIView {
        MetronomeViewController *metronomeViewController;
    ...
    

    【讨论】:

    • 请看-nextResponder的答案。
    【解决方案2】:

    您可以使用-nextResponder 方法来执行此操作。根据http://developer.apple.com/library/ios/documentation/uikit/reference/UIResponder_Class/Reference/Reference.html#//apple_ref/occ/instm/UIResponder/nextResponder,“UIView 通过返回管理它的 UIViewController 对象(如果有)或其父视图(如果没有)来实现此方法”

    【讨论】:

    • 这是一个很好的解决方法,但视图永远不需要直接访问它们的控制器。这就是我们有代表的原因。
    【解决方案3】:

    您不应该保存对视图控制器的引用,因为它可能会动态变化。 每次需要时遍历响应者链。

    【讨论】:

      【解决方案4】:

      你可以使用

      [(MyParentViewController *)[[self.view superview] nextResponder] doSomething];
      

      【讨论】:

      • 文档说“UIView 通过返回管理它的 UIViewController 对象(如果有)或其父视图(如果没有)来实现此方法;”。因此,如果视图嵌套很深,nextResponder 将简单地返回它的超级视图的超级视图(不是控制器),从而导致错误(未知选择器)。另一方面,如果视图是控制器的视图,它可能会返回另一个控制器(例如控制器在 navigationController 中,因此控制器的父视图是 navigationController 的视图,nextResponder 将返回 navigationController)。所以这就是我投反对票的原因
      【解决方案5】:

      您可以使用以下内容:

          UIViewController* yourViewController = 
                            (UIViewController*)[(YourAppDelegate*)
                            [[UIApplication sharedApplication] delegate] viewController];
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-21
        • 2012-09-21
        • 1970-01-01
        相关资源
        最近更新 更多