iOS Dev,如何调用UIViewController的超类中的方法?

时间:2011-06-19 14:19:22

标签: objective-c ios xcode

我有两个UIViewControllers,例如A和B.

在A上按下时有一个按钮将视图B作为子视图加载。使用标准的initWithNibName。在B上有一个按钮,它取消了视图B并且应该在视图A(其父视图)中调用方法。我认为它应该是一个简单的[super methoddName:perimeter],但这不起作用。在放置一个NSLog打印出来的parentViewController名称后,它返回null,这是奇怪的,因为它应该返回View A作为Parent视图。

任何想法欢呼

4 个答案:

答案 0 :(得分:0)

super指的是你的类的超类,而不是它的父视图控制器。

快速执行此操作的方法是创建一个新的init方法,该方法接受视图控制器A的实例,使用它来设置按钮的目标。

最好的方法是在视图控制器B上定义一个新协议。使视图控制器A符合它。在B的初始化时,传递参考A以用作您的代表。然后在按钮上按下B,在代理上调用所需的方法。

答案 1 :(得分:0)

通过让视图控制器A成为视图控制器B上的委托,您可能会感觉更好。

A可以在加载之后但在将其推入视图之前在B上设置委托属性,当B需要调用所需方法时,它可以在委托对象上调用它。

这使得控制器之间的耦合更加松散,如果让代理符合协议,您可以将B的{​​{1}}知识保持在最低限度。

如果你问我,这是更好的设计。

答案 2 :(得分:0)

如果将视图控制器B的视图添加为子视图,则

parentViewController将不起作用。您必须以不同的方式查找视图控制器A.

说,如果您已将B的视图添加为此类子视图,

[A.view addSubview:B.view];

然后你可以像这样调用视图控制器A.

[[B.view.superview nextResponder] methoddName:perimeter];

如果您在B.view的视图层次结构中的某个位置添加了A.view作为子视图。

UIResponder * responder = B.view.superview;
do {
    responder = [responder nextResponder];
} while ( ![responder isMemberOfClass:[A class]] );

// `responder` is referencing your view controller A. You will have to cast it.

答案 3 :(得分:0)

最简单的方法,特别是如果它是静态方法:

<强> ViewControllerB

#import "ViewControllerA.h"

- (void)dismissView{
    //implementation to close the view

    [ViewControllerA methodName:perimeter];
}

祝你好运!