viewdidAppear:为什么我必须打电话给超级?

问题描述:

从Apple的文档中,如果我重写该方法,我必须在某个时候调用super。我有两个ViewController与一个segue连接在一起。如果您在第一个VC中按下一个按钮,则会转到第二个VC。问题是当我覆盖了第一个VC的viewDidAppear,并且调用了第二个VC的super,viewDidAppear,这不是我想要的。我删除了super,一切都很好。viewdidAppear:为什么我必须打电话给超级?

  • 为什么从第一个VC打电话给super.viewDidAppear会叫secondVC.viewDidAppear
  • 是不是打电话给viewDidAppear不好主意?

预先感谢您!

+1

是第一个VC和第二类VC相互关联?我的意思是继承。 – FreeNickname 2015-02-07 16:06:40

+1

显示两个视图控制器的代码。调用'[super viewDidAppear:animated]'不会调用另一个视图控制器上的方法,除非在你的程序中有一个奇怪的错误。你更可能将实例与类混合在一起。 – Codo 2015-02-07 16:12:11

+0

是的,谢谢你们:D – 2015-02-07 17:17:22

不打电话[super viewDidAppear]确实是一个坏主意。 UIViewController的基类有viewDidAppear中的代码需要调用,否则事情将无法正常工作。我忘记了之前拨打[super viewDidAppear],事情无法正常工作。我忘记了什么是坏的影响,但它们微妙而混乱,无法调试。

第二个视图控制器调用[super viewDidAppear]调用第一个视图控制器没有任何意义。我认为你是误解。

我的猜测是你的第二个视图控制器是第一个视图控制器的子类。在你的第二个视图控制器中,当你调用[super viewDidAppear]时,它会调用父类的方法实现。由于您的第二个视图控制器的类与第一个视图控制器相同,因此该父类CLASS的方法被调用。但是它不会在第一个视图控制器实例上调用。子视图控制器有多个可以调用的viewDidAppear版本:它的.m文件中的自定义方法,写在其父类的.m文件中的方法,以及在其祖父类中定义的方法的任何实现,非常棒-grandparent类等

隐喻:

想象一下狗的进化。首先只有狗,没有品种的狗。 狗可以摆动它们的尾巴,所以所有的狗都有一个“摇摆”的方法。

母狗有一只小狗是第一个指针。 (类Pointer。)它继承了它的父类的所有方法,包括wag,但也有一个方法“point”。

它也有一点摆动它的正常摇摆,所以它有一个自定义的摇摆方法的实施。这是标准wag方法的新结局,所以指针类首先调用父类的wag方法,然后是自定义方法。

在指针的“wag”方法的实现中,它在调用[super wag]来完成父类CLASS的之前添加它自己的摆动。

使指针类的WAG方法可能是这样的:

@implementation Pointer 

- (void) wag; 
{ 
    [super wag]; 
    [self tailWiggle]; 
} 

@end 

现在,如果你有妈妈(Dog类的实例),毗邻各小狗(类指针的一个实例)另外,你的两种摇摆方法都有断点,这里将会发生什么。

当小狗摇尾巴时,它首先调用父类** CLASS的* wag方法。 (它并没有要求它的母亲Dog摇摆它的尾巴,它使用父类定义的狗摇摆方法。)

既然你在Dog类和指针类,你会在Dog类的wag方法中看到一个断点。然而,它仍然是摇摆尾巴的小狗。在最后添加指针特定的摆动之前,它只是做了第一个正常的Dog风格的摇摆。所以这是狗的小狗实例,做了Dog版本的Wag,它的代码是在Dog类的实现中定义的。

您可能误解了断点/日志声明,并认为您看到母狗的摆动方法正在启动。然而,这并不是什么事情。

现在,回到你的问题。

说视图控制器之一是类型ParentVC的,和视图控制器2是类型ChildVC,它从ParentVC继承的:

@interface ChildVC: ParentVC 
... 
@end 

视图控制器2是类型的ChildVC,视图控制器1.当的子类视图控制器2调用[super viewdidAppear],它在为ParentVC类定义的代码中调用它。这与在视图控制器1中调用该方法不同。

查看调试变量列表并记下视图控制器1和视图控制器2的内存地址。当您在呼叫中断到viewDidAppear时,请注意调用该方法的对象的内存地址。

当视图控制器2个呼叫[super viewdidAppear],你会看到在ParentVC.m文件运行定义的代码,但运行代码的对象是视图控制器2

+0

我总是喜欢看你的答案 – soulshined 2015-02-07 17:05:00

+0

谢谢。你完全在意。问题是第二个VC是父类被定义为'ViewController'而不是'UIViewController'! – 2015-02-07 17:16:43

+1

有时可以使视图控制器的其他自定义视图控制器类的子类有效。 – 2015-02-07 18:16:08