2010-05-17 10 views
6

Gram z szablonem SplitView iPada w Xcode. Oto dwie z wielu ważnych metod, które są generowane automatycznie dla Ciebie przez szablon Application Podziel widok opartego ...Dlaczego metoda didFinishLaunchingWithOptions mojego uczestnika aplikacji nagle została wywołana przez moją metodę RootViewController: viewDidLoad?

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(); 
    } 
} 

Po zbudowaniu i uruchomieniu projektu przed wprowadzeniem jakichkolwiek zmian, metoda application:didFinishLaunchingWithOptions jest wywoływana przedMetodajest wywoływana. Jestem nowy w rozwoju iPhone'a, ale zakładam, że jest to poprawna i typowa sekwencja. Więc tutaj są zmiany zrobiłem ...

  • Gdy potwierdziłem wszystko działa bez żadnych modyfikacji, zmieniłem kod RootViewController i ustawić go jako podklasa UIViewController (zamiast UITableViewController domyślnie) i wykonane odpowiednie korekty w konstruktorze interfejsów. Budowałem i biegałem, wszystko działało bez zarzutu.
  • Następnie dodałem UIView (bez niczego) do RootView w IB i kiedy zbudowałem go i uruchomiłem, nagle RootViewController:viewDidLoad jest wywoływany przed metodą application:didFinishLaunchingWithOptions.

Muszę dostać go z powrotem do sposobu, w jaki pracował wcześniej, bo jak widać w kodzie, metoda viewDidLoad zależy od sposobu didFinishLauchingWithOptions do wykonania, dzięki czemu można go ustawić rootViewController na managedObjectContext że używa do wykonywania żądanie pobrania.

  1. Jakieś pomysły, które to spowodowały?
  2. Jakieś pomysły, jak mogę to naprawić?

Bardzo dziękuję z góry za pomoc! Będę badał i bawił się z kodem.

Odpowiedz

4

w szablonie aplikacji -applicationDidFinishLaunching dodaje widok RootViewController do okna, co powoduje, że widok, aby załadować, więc oczywiście -viewDidLoad będzie śledzić - applicationDidFinishLaunching.

ViewDidLoad jest (pośrednio) wywoływane z applicationDidFinishLaunching.

Jeśli, jak mówisz, viewDidLoad jest wywoływana przed applicationDidFinishLaunching, ponieważ zrobiłeś coś, co spowodowało załadowanie widoku przed wywołaniem applicationDidFinishLaunching.

Czy dodałeś punkt przerwania w -viewDidLoad i spojrzał na stacktrace, aby zobaczyć, co było odpowiedzialne za wywoływanie go?

2

Gdzie inicjujesz numer RootViewController? Zazwyczaj robisz to w applicationDidFinishLaunching (przynajmniej na iPhone'ie). Jeśli inicjowanie go w init metody swojej aplikacji delegata, który mógłby spowodować viewDidLoad metoda kontrolera widoku głównego, aby być powoływane przed applicationDidFinishLaunching.

+0

Dzięki, eman! Szablon aplikacji oparty na SplitView nie generuje żadnego kodu inicjalizacyjnego dla RootViewController, przynajmniej nigdzie go nie widzę. Odkąd jestem nowy w rozwoju iPada i bazuję na tym, czego się do tej pory nauczyłem, zakładam, że logika inicjalizacji dla RootViewController jest osadzona w pliku końcówki okna głównego, ponieważ większość interfejsu została utworzona w IB, prawda? – BeachRunnerFred

2

Jest to propozycja wynikająca z faktu, że w pliku MainWindow.xib obiekt delegujący aplikację nie jest połączony z właścicielem pliku (UIApplication). Możesz otworzyć plik MainWindow.xib i kliknąć prawym przyciskiem na swoim App Delegacie aplikacji, aby sprawdzić, czy ma połączenie w punkcie referencyjnym do właściciela pliku. Jeśli nie, ustaw go na. A to rozwiąże twój problem.

Powiązane problemy