-(void)viewWillAppear:(BOOL)animated{
//something here
[super viewWillAppear];
}
总是需要[super viewWillAppear];
吗?如果不是何时以及为何使用它?
答案 0 :(得分:51)
首先,正确的锅炉板应该是:
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
//something here
}
换句话说,首先致电super
,然后做自己的事情。您必须将animated
参数传递给super
。
您通常希望在任何方法中首先调用超类的实现。在许多语言中都是必需的。在Objective-C中它不是,但如果你不把它放在方法的顶部,你很容易遇到麻烦。 (也就是说,我有时会打破这种模式。)
调用super's
实施是否需要?对于这种特殊方法,如果不调用它,可能会出现意外行为(例如,如果您已经将UINavigationController
子类化了)。所以答案是不不是技术意义上的,但你应该总是这样做。
但是,在许多其他方法中,可能有充分理由不调用super
。
答案 1 :(得分:8)
答案 2 :(得分:3)
根据我的经验,在第一行调用[super viewWillAppear]
时,在此之后调用reloadData
时,无法在从详细视图返回时检索先前选定的行。当[super viewWillAppear]
是最后一句时,您可以获取所选行并显示先前选择的行提示。只有在[tableView reloadData]
内使用viewWillAppear
时才会发生这种情况。
答案 3 :(得分:2)
假设您有2个班级,父母和孩子。子继承自Parent。他们有一个名为greet的方法,它返回一个字符串。
这是父方法的样子:
代码:
-(NSString *)greet {
return @"Hello";
}
我们希望孩子向父母学习。所以我们用super来说问妈妈会怎么问候,但也有我们自己的小补充。
代码: //从Parent继承
-(NSString *)greet {
NSString *parentGreeting = [super greet];
return [parentGreeting stringByAppendingString:@", Mommy"]
}
所以现在父母问候"你好",孩子问候"你好,妈咪"。稍后,如果我们改变父母的问候语只返回"嗨",那么这两个课程都会受到影响,你将会有#34;嗨"和"嗨,妈妈"。
super用于调用超类定义的方法。它用于访问已被子类覆盖的方法,以便类可以将其自己的代码包装在其父类实现的方法周围。如果你正在做任何类型的继承,这非常方便。