我对此有点了解。我通过以下方式初始化UITableViewController
子类CTSettingsVC
:
CTSettingsVC *settingsVC = [[CTSettingsVC alloc] init];
但是,正在调用initWithStyle
初始值设定项。这是我的文件:
@interface CTSettingsVC ()
@end
@implementation CTSettingsVC
- (id)initWithStyle:(UITableViewStyle)style
{
self = [super initWithStyle:style];
if (self) {
NSLog(@"Why is this called?")
self.title = @"Settings";
}
return self;
}
@end
我不确定这是否是预期的行为,或者我是否遗漏了某些内容。
答案 0 :(得分:7)
这是因为initWithStyle:
是UITableViewController
的指定初始值设定项。 init
的{{1}}方法看起来像这样:
UITableViewController
并非所有UIKit类都遵循这个覆盖- (instancetype)init
{
//NOTE: self is being used instead of super
return [self initWithStyle:UITableViewStylePlain];
}
的约定,其中包含指定初始值设定项的默认值。如果我计划使用init
作为默认初始化程序来确保我的子类在未来版本的UIKit中不被破坏,我经常自己这样做。
答案 1 :(得分:1)
init
和initWithStyle:
是UITableViewController
的便捷初始值设定项。在内部,它们看起来像这样:
- (instancetype)init
{
return [self initWithStyle:UITableViewStylePlain];
}
- (instancetype)initWithStyle:(UITableViewStyle)style
{
self = [self initWithNibName:nil bundle:nil];
if (self) {
_tableViewStyle = style; // Private, used in loadView.
}
return self;
}
当您的视图控制器由故事板实例化时,您将看不到initWithNibName:bundle:
被调用的异常。在那里,initWithCoder:
是初始化程序。