Почему метод didFinishLaunchingWithOptions моего делегата внезапно вызывается ПОСЛЕ моего метода RootViewController: viewDidLoad? - PullRequest
6 голосов
/ 18 мая 2010

Я играл с шаблоном SplitView для iPad в XCode. Вот два из многих важных методов, которые автоматически генерируются для вас шаблоном приложения на основе разделенного представления ...

AppNameAppDelegate.m

#pragma mark -
#pragma mark Application lifecycle

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    // Override point for customization after app launch    
    rootViewController.managedObjectContext = self.managedObjectContext;


    // Add the split view controller's view to the window and display.
    [window addSubview:splitViewController.view];
    [window makeKeyAndVisible];

    return YES;
}

RootViewController.m

#pragma mark -
#pragma mark View lifecycle

- (void)viewDidLoad {

    [super viewDidLoad];
    self.clearsSelectionOnViewWillAppear = NO;
    self.contentSizeForViewInPopover = CGSizeMake(320.0, 600.0);

    NSError *error = nil;
    if (![[self fetchedResultsController] performFetch:&error]) {

        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }
}

Когда вы строите и запускаете проект перед тем, как вносить какие-либо изменения, метод application:didFinishLaunchingWithOptions вызывается до вызова метода RootViewController:viewDidLoad. Я новичок в разработке для iPhone, но я предполагаю, что это правильная и типичная последовательность. Итак, вот изменения, которые я сделал ...

  • Как только я подтвердил, что все работает без каких-либо изменений, я изменил код RootViewController и установил его в качестве подкласса UIViewController (вместо UITableViewController по умолчанию) и внес соответствующие изменения в Interface Builder. Я построил и побежал, все еще работало нормально.
  • Затем я добавил UIView (без него) в RootView в IB, и когда я его собрал и запустил, внезапно RootViewController:viewDidLoad вызывается перед методом application:didFinishLaunchingWithOptions.

Мне нужно вернуть его обратно к тому, как он работал раньше, потому что, как вы можете видеть из кода, метод viewDidLoad зависит от метода didFinishLauchingWithOptions, который необходимо выполнить, чтобы он мог установить managedObjectContext rootViewController, который он использует для выполнения запрос на получение.

  1. Есть идеи, что вызвало это?
  2. Есть идеи, как мне это исправить?

Заранее большое спасибо за вашу помощь! Я буду продолжать исследовать и играть с кодом.

Ответы [ 3 ]

4 голосов
/ 27 мая 2010

В шаблоне app -applicationDidFinishLaunching добавляет представление RootViewController к окну, вызывая его загрузку, поэтому очевидно, что -viewDidLoad будет следовать - applicationDidFinishLaunching.

ViewDidLoad (косвенно) вызывается из applicationDidFinishLaunching.

Если, как вы говорите, viewDidLoad вызывается до applicationDidFinishLaunching, это потому, что вы сделали что-то, чтобы заставить представление загружаться до вызова applicationDidFinishLaunching.

Вы добавили точку останова в -viewDidLoad и посмотрели на трассировку стека, чтобы увидеть, что было причиной его вызова?

2 голосов
/ 18 декабря 2010

Это пропабалия, вызванная тем, что в MainWindow.xib ваш объект делегата приложения не связан с владельцем файла (UIApplication). Вы можете открыть файл MainWindow.xib и щелкнуть правой кнопкой мыши на делегате приложения, чтобы увидеть, есть ли у него соединение в выходной ссылке с владельцем файла. Если нет, установите его на. И это решит вашу проблему.

2 голосов
/ 18 мая 2010

Где вы инициализируете RootViewController? Как правило, вы делаете это в applicationDidFinishLaunching (по крайней мере, на iPhone). Если вы инициализируете его в методе init делегата приложения, это может привести к вызову метода viewDidLoad контроллера корневого представления до applicationDidFinishLaunching.

...