Tôi là người mới sử dụng lập trình UI trên Mac và iPhone, và tôi đã chạy qua thứ gì đó khiến tôi hơi khó hiểu.Thứ tự khởi tạo UIViewController và tải
Một UIViewController có 3 phương pháp có liên quan đến việc khởi tạo của nó và xem nó:
- init (và các phương pháp init-like)
- loadView
- viewDidLoad (phương pháp đại biểu)
Tôi mong đợi những điều này xảy ra theo thứ tự ở trên. Đầu tiên UIViewController được cấp phát bởi một số đối tượng khác, sau đó init được gọi ngay lập tức (hoặc một số phương thức init khác, như initWithStyle).
Chỉ khi đối tượng được khởi tạo, tôi mong đợi nó sẽ gọi hàm loadView của riêng nó, sau đó chế độ xem, sau khi được tải, gọi phương thức ủy quyền viewDidLoad.
này không xảy ra, ví dụ:
@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
Tạo giao diện điều khiển đầu ra:
0
2
3
1
Các loadView và viewDidLoad phương pháp, do đó, không thể thực hiện cuộc gọi đại biểu, như các đại biểu thường là đặt sau khi gọi tới [super init], được gọi là sau loadView và viewDidLoad đã chạy:
UIViewControllerSubClass *someViewController = [[UIViewControllerSubclass alloc] init];
[viewController setDelegate:self];
Nếu tôi muốn chạy mã thiết lập ViewController theo một cách nào đó, thông báo cho đại biểu khi nó đi, mã có nên nằm trong phương thức init không? Không phải là lý do cho loadView tồn tại để cho phép mã như vậy được chạy vào thời điểm thích hợp? Dường như với tôi như tôi sẽ phải tạo một phương thức initWithDelegate mới, thiết lập ivar đại biểu trước khi gọi [super init], điều này có đúng không, hoặc tôi đang đi sai về điều này?
Cảm ơn trước :)
Lưu ý: viewDidUnload không còn được dùng như iOS 6.0 nữa. – Brainware