Почему didFinishLaunchingWithOptions метод делегата моего приложения, внезапно будучи названным ПОСЛЕ моего метода RootViewController:viewDidLoad?

Я играл с шаблоном 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 по умолчанию), и внес соответствующие корректировки в Интерфейсном Разработчике. Я создал и работал, все все еще хорошо работало.
  • Затем я добавил UIView (ни с чем в нем) к RootView в IB и когда я создал и выполнил его, внезапно RootViewController:viewDidLoad называется перед application:didFinishLaunchingWithOptions метод.

Я должен вернуть его к способу, которым это работало, прежде, потому что, как Вы видите в коде, viewDidLoad метод зависит от didFinishLauchingWithOptions метода для выполнения так его, может установить rootViewController's managedObjectContext то, что это использует для выполнения запроса выборки.

  1. Какие-либо идеи, что вызвало это?
  2. Какие-либо идеи, как я могу зафиксировать это?

Большое спасибо заранее для Вашей справки! Я собираюсь продолжать исследовать и играть с кодом.

6
задан BeachRunnerFred 19 May 2010 в 13:27
поделиться

2 ответа

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

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

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

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

.
4
ответ дан 16 December 2019 в 21:36
поделиться

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

2
ответ дан 16 December 2019 в 21:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: