我有两个UIViewControllers,例如A和B.
在A上按下时有一个按钮将视图B作为子视图加载。使用标准的initWithNibName。在B上有一个按钮,它取消了视图B并且应该在视图A(其父视图)中调用方法。我认为它应该是一个简单的[super methoddName:perimeter],但这不起作用。在放置一个NSLog打印出来的parentViewController名称后,它返回null,这是奇怪的,因为它应该返回View A作为Parent视图。
任何想法欢呼
答案 0 :(得分:0)
super指的是你的类的超类,而不是它的父视图控制器。
快速执行此操作的方法是创建一个新的init方法,该方法接受视图控制器A的实例,使用它来设置按钮的目标。
最好的方法是在视图控制器B上定义一个新协议。使视图控制器A符合它。在B的初始化时,传递参考A以用作您的代表。然后在按钮上按下B,在代理上调用所需的方法。
答案 1 :(得分:0)
通过让视图控制器A
成为视图控制器B
上的委托,您可能会感觉更好。
A
可以在加载之后但在将其推入视图之前在B
上设置委托属性,当B需要调用所需方法时,它可以在委托对象上调用它。
这使得控制器之间的耦合更加松散,如果让代理符合协议,您可以将B
的{{1}}知识保持在最低限度。
如果你问我,这是更好的设计。
答案 2 :(得分:0)
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];
}
祝你好运!