2012-09-29 11 views
5

Przepraszam, jeśli moje pytanie może brzmieć głupio dla niektórych z was. Jestem stosunkowo młodym projektantem iOS, ale muszę podłączyć aplikację na iOS6. Aplikacja działa doskonale na iOS 5 i XCode 4.3.2, ale mam dziwny błąd z Xcode 4.5 na symulatorze iPhone 6.0. Po początkowym ekran jest ładowany mogę uderzyć dowolny przycisk chcę, i pojawia się błąd:Segue nie działa z iOS6

`Terminating app due to uncaught exception 'NSGenericException', reason: 'Could not find a navigation controller for segue 'register'. Push segues can only be used when the source controller is managed by an instance of UINavigationController.` 

Sposób prepareForSegue z StartScreenViewController wygląda to

if ([[segue identifier] isEqualToString:@"register"] || [[segue identifier] isEqualToString:@"forgotPassword"]) { 
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:[segue destinationViewController]]; 
    appDelegate.window.rootViewController = navController; 
} 

Ustawianie przerwania pokazuje mi, że metoda jest nadal nazywana poprawną, ale po zakończeniu fazy prepareForSegue aplikacja ulega awarii z powodu wspomnianego błędu. Czy ktokolwiek mógłby wskazać mi właściwy kierunek?

Dziękuję bardzo Martin

Odpowiedz

5

bo jesteś za pomocą push segueCocoa poszukuje rodowego kontrolera nawigacji w hierarchii z StartScreenViewController.

  • Jeśli znajdzie, użyje go do automatycznego wypchnięcia nowego kontrolera widoku na stos kontrolera nawigacyjnego.
  • Ponieważ nie znajduje się jedna, Twoja aplikacja ulega awarii.

prepareForSegue: istnieje dla was skonfigurowania VC to wszystko, aby automatycznie wyświetlane przez iOS. To nie twoja odpowiedzialność za wyświetlanie VC, który wydajesz się robić po ustawieniu window.rootViewController.

Możesz przeczytać tych docs: http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/Introduction/Introduction.html

5

Można powiedzieć, że „aplikacja działa idealnie”, ale faktem jest, że kod zacytowanie zawsze było bardzo źle, więc wydaje się, że to wrongness jest teraz jest narażony. Nigdy nie powinieneś zmieniać kontrolera widoku głównego okna w środku aplikacji; powinieneś ustawić go raz podczas startu i nigdy więcej. I, jak słusznie powiedział Joshua, przygotowanie się na segue nie jest czasem, abyś bałaganił ze strukturą kontrolera widoku, z którą sama segue ma ochotę.

Masz walizkę na ręce. Dobrym pomysłem może być zatrzymanie i zrozumienie systemu iOS oraz wyświetlenie kontrolerów (i storyboardów), zanim podejmiesz kolejny krok, ponieważ możesz skończyć się zgrywaniem całej architektury tej aplikacji, aby to naprawić. Oto niektóre help:

http://www.apeth.com/iOSBook/ch19.html

2

mam ten sam problem. Aplikacja działa dobrze na urządzeniu ios6, gdy pobierany jest sklep z aplikacjami, ale ten sam kod nie działa na urządzeniu lub symulatorze. Bardzo dziwny problem.

Moja aplikacja struktura jest następująca:

NavigationController ->UIViewController (ma PageControl trzymać wiele stron poziomo Przesuwne) ->UITableViewController (reprezentuje jedną listę Wiadomości dla jednej kategorii), a gdy użytkownik kliknie na jedną wiadomość, otrzymuje DetailsViewController (instancja UIViewController).

Jest to kod z prepareForSegue:

if ([[segue identifier] isEqualToString:@"ShowTelegrafDetails"]){ 
    TelegrafDetailsViewController *details = (TelegrafDetailsViewController*)segue.destinationViewController; 

    NSIndexPath *myIndexPath = [self.tableView indexPathForSelectedRow];  

    if([self isItPad]) 
     details.linkFromTableView = [[otherNews objectAtIndex:myIndexPath.row] link]; 
    else 
     details.linkFromTableView = [[[myViewController.itemMatrix objectAtIndex:[self calculateCurrentPage]] objectAtIndex:myIndexPath.row] link]; 

    NSLog(@"%@",segue.sourceViewController); 
    NSLog(@"%@",segue.destinationViewController); 

    [self.myViewController.navigationController pushViewController:details animated:YES]; 
    } 

Wydaje się, że kontroler źródłowy jest ustawiony jak to ma używam storyboardów i NavigationController jest ustawiana automatycznie. Nie wiem, czy muszę ustawić RootViewController gdzieś jawnie, ale może to być trudne do ustawienia w AppDelegate, ponieważ mam dwie dodatkowe hierarchie widoku między delegatem i klasy, która powinna być root (UITableViewController).

Jeśli ktoś wie coś więcej na ten temat, to jestem wiecznie wdzięczny, inaczej mógłbym użyć pewnych wskazówek. Czytałem dokumentację Apple dotyczącą tego tematu, ale nie mogę w pełni jej zrozumieć, jeśli chodzi o tak złożone sytuacje.

Ponadto, jeśli znajdę jakieś rozwiązanie, chętnie opublikuję go tutaj, jak szef. : D

Thanx z góry.

EDIT:

udało mi się rozwiązać ten problem. Po prostu usunięto segues i kod z prepareForSegue do didSelectRowAtIndexPath, z odpowiednimi poprawkami. To nie jest idealne rozwiązanie, ale rozwiązuje problem. Chociaż mam plan obsługiwać ponad 4.3 urządzeń, a scenorysy nie są w tym przypadku opcją.

Mam również podwójnie sprawdzony kod, dowiedziałem się, że RootViewController został poprawnie utworzony i wyświetlony, NavigationController działa dobrze i nadal nie mogę zrozumieć, dlaczego segues nie działa.

Pozdrawiam.