从Apple的文档中,如果我覆盖该方法,我必须在某个时候调用super
。我有两个ViewControllers与segue连接在一起。如果按第一个VC中的按钮,则转到第二个VC。问题是当我覆盖第一个VC的viewDidAppear
,并调用第二个VC的super
,viewDidAppear
时,这不是我想要的。我删除了super
,一切都很好。
super.viewDidAppear
会调用secondVC.viewDidAppear
?viewDidAppear
是个坏主意吗?提前谢谢!
答案 0 :(得分:7)
不调用[super viewDidAppear]
确实是一个坏主意。 UIViewController
的基类包含viewDidAppear
中需要调用的代码或者无法正常运行的代码。我以前忘记打电话给[super viewDidAppear]
,事情不能正常工作。我忘记了什么是不好的效果,但它们是微妙的,并且很难调试。
第二个视图控制器对[super viewDidAppear]
的调用正在调用第一个视图控制器是没有意义的。我认为你是误会。
我的猜测是你的第二个视图控制器是第一个视图控制器的子类。在第二个视图控制器中,当您调用[super viewDidAppear]
时,它会调用父类的方法实现。由于您的第二个视图控制器的类与第一个视图控制器相同,因此将调用该父 CLASS的方法。但是,它未在第一个视图控制器实例上调用。子视图控制器有多个版本的viewDidAppear可以调用:它的.m文件中的自定义方法,写在它的父类的.m文件中的方法,以及在它的祖父级类中定义的方法的任何实现,很棒-grandparent class等。
隐喻:
想象一下狗的进化。首先,只有狗,没有狗品种。 狗可以摇尾巴,所以所有的狗都有“摇摆”的方法。
一只母狗有一只小狗是第一个指针。 (类Pointer
。)它继承了它的父类的所有方法,包括wag,但也有一个方法“点”。
它在正常摇摆结束时也有点摆动,所以它有一个wag方法的自定义实现。这是标准wag方法的新结局,因此Pointer类首先调用父类的wag方法,然后是自定义方法。
在指针的“摇摆”方法的实现中,它调用[super wag]
来做父 CLASS的摇摆,然后在最后添加它自己的摆动。
所以Pointer类的wag方法可能如下所示:
@implementation Pointer
- (void) wag;
{
[super wag];
[self tailWiggle];
}
@end
现在,如果你有母亲(班级狗的一个实例)和小狗(类指针的一个实例)站在一起,你的两个摇摆方法都有断点,这就是将要发生的事情。 / p>
当小狗摇尾时,它首先调用父** CLASS的* wag方法。 (它不会问它的母亲,Dog
,摇尾巴,它使用父类定义的狗摇摆方法。)
由于Dog类和Pointer类的wag方法中都有断点,因此您将在Dog类的wag方法中看到断点。然而,仍然是小狗摇着它的尾巴。它只是做了第一次正常的狗式摇摆,然后在最后添加了Pointer特定的摆动。所以它是狗的小狗实例,做了Wag的Dog版本,其代码是在Dog类的实现中定义的。
你可能会误解断点/日志语句,并认为你看到母狗的摇摆方法被解雇了。然而,这不是正在发生的事情。
现在,回到你的问题。
假设视图控制器1的类型为ParentVC,而视图控制器2的类型为ChildVC,它继承自ParentVC:
@interface ChildVC: ParentVC
...
@end
View Controller 2的类型是ChildVC,它是视图控制器1的子类。当视图控制器2调用[super viewdidAppear]
时,它在为ParentVC类定义的代码中调用它。这与在视图控制器1中调用该方法不同。
查看调试变量列表并记下视图控制器1和视图控制器2的内存地址。当您中断对viewDidAppear的调用时,请注意调用该方法的对象的内存地址。
当视图控制器2调用[super viewdidAppear]
时,您将看到运行的ParentVC.m文件中定义的代码,但运行该代码的对象是视图控制器2.