如何通过代码从UIView获取一个UIViewController

9
有一种方法可以从UIView对象获取视图控制器引用吗?我需要像这样的东西:
MyParentViewController *myParentViewController = [self.view.superview controller];
5个回答

16

4
这是一个不错的解决方法,但视图不应该直接访问它们的控制器,这就是为什么我们有委托的原因。 - Sulthan

5

默认情况下,UIView没有对UIViewController的引用。您可以将其添加到您的UIView子类中,并在创建UIViewController中的UIView时进行设置。

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

您可以查看如何在UIView子类中创建对UIViewController的引用以及如何/在何处设置它的示例,请参阅iPhone的视图控制器编程指南,请参见以编程方式创建视图中的定义自定义视图控制器类,这里是示例,有关更多详细信息,请参见链接的Metronome示例。

 - (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;
...

1
请查看关于-nextResponder的答案。 - Paul Scott

2
您可以使用

标签


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

文档中说:“UIView通过返回管理它的UIViewController对象(如果有)或其superview(如果没有)来实现此方法;”。因此,如果视图嵌套得很深,nextResponder将仅返回其superview的superview(而不是控制器),从而导致错误(未知选择器)。另一方面,如果视图是控制器的视图,则可以返回另一个控制器(例如,控制器在navigationController中,因此控制器的父视图是navigationController的视图,nextResponder将返回navigationController)。这就是我为什么投了反对票的原因。 - JakubKnejzlik

1
您可以使用以下内容:
    UIViewController* yourViewController = 
                      (UIViewController*)[(YourAppDelegate*)
                      [[UIApplication sharedApplication] delegate] viewController];

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接