Как сконструирован IBOutlet UIViewController?

#iphone #objective-c #cocoa-touch

#iPhone #objective-c #cocoa-touch

Вопрос:

Я расширяю шаблон Apple для отложенной загрузки изображения таблицы. Я хотел бы, чтобы следующий код выполнялся при создании RootViewController.

 [[NSNotificationCenter defaultCenter] addObserver:self 
selector:@selector(applicationWillEnterForeground:)
name:UIApplicationWillEnterForegroundNotification
object: nil];
  

Проблема в том, что я не знаю, как сконструирован RootViewController. Я попробовал следующие два метода, но они так и не были выполнены. Я ввел NSLog эти методы, и они так и не были распечатаны.

 - (id)initWithNibName:(NSString *)nibNameOrNil 
               bundle:(NSBundle *)nibBundleOrNil
- (id)init
  

Я открыл MainWindow.xib и заметил, что он загружает RootViewController как IBOutlet в UIApplicationDelegate . Итак, RootViewController является подклассом UIViewController . Итак, вопрос сводится к «как сконструирован IBOutlet UIViewController?»

Ответ №1:

Вы можете выполнить код, который вам нужно выполнить, в методе awakeFromNib, он вызывается декодером после создания выхода.

Комментарии:

1. Можете ли вы объяснить, почему -(id)init , как определено в NSObject, не выполнялось? RootViewController -> UITableViewController -> UIViewController -> NSResponder -> NSObject.

2. В файле NIB хранятся сериализованные объекты. Когда вы загружаете файл nib, они десериализуются, а не создаются, поэтому методы инициализации не вызываются.

3. вот почему у вас есть awakeFromNib, так что вам не нужно беспокоиться =)

4. Я понятия не имею, как добавить awakeFromNib в мой UIViewController . Я импортировал NSNibLoading.h , потому что именно там он определен. И я добавил NSNibAwaking к списку протоколов. В обеих добавленных мною строках говорилось то-то и то-то, что не было определено. Согласно документам, awakeFromNib поступает из AppKit.framework . Я даже не смог найти этот фреймворк в списке существующих фреймворков. Я полностью потерян.

5. awakeFromNib добавляется в NSObject, все, что вам нужно сделать, это добавить метод -(void)awakeFromNib в ваш RootViewController, и он будет вызван.