我对Mac和iPhone上的UI编程相当陌生,而且我遇到了一些让我感到困惑的事情.
UIViewController有3个方法,涉及它的初始化及其视图:
我希望这些按照上面的顺序发生.第一个UIViewController由其他一些对象分配,然后立即调用init(或其他一些init方法,如initWithStyle).
只有在初始化对象后,我才会期望它调用自己的loadView函数,之后视图加载后会调用viewDidLoad委托方法.
例如,这不会发生:
@implementation UIViewControllerSubclass
- (id)init {
NSLog(@"0");
if (self = [super init]) {
NSLog(@"1");
}
return self;
}
- (void)loadView {
[super loadView];
NSLog(@"2");
}
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"3");
}
@end
Run Code Online (Sandbox Code Playgroud)
生成控制台输出:
0
2
3
1
Run Code Online (Sandbox Code Playgroud)
因此,loadView和viewDidLoad方法不能进行委托调用,因为委托通常在调用[super init]之后设置,在 loadView和viewDidLoad运行之后调用(如上所示):
UIViewControllerSubClass *someViewController = [[UIViewControllerSubclass alloc] init];
[viewController setDelegate:self];
Run Code Online (Sandbox Code Playgroud)
如果我想运行以某种方式设置ViewController的代码,通知代理,如果代码驻留在init方法中?loadView现有的原因是否允许在适当的时候运行此类代码?
在我看来,我必须创建一个新的initWithDelegate方法,该方法在调用[super init] 之前设置委托ivar ,这是对的,还是我以错误的方式进行此操作?
提前致谢 :)