2014-11-06 15 views
6

Próbuję opracować główną aplikację iOS (tylko iPad) z szablonu xCode 6. Działa poprawnie z iOS 8, ale działa to na iOS 7.0 lub 7.1 powoduje katastrofę w czasie wykonywania gdzie ja powiedział:Szablon aplikacji iOS Master-Detail z xCode 6 nie działa na iOS 7

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    // Override point for customization after application launch. 
    UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController; 
    UINavigationController *navigationController = [splitViewController.viewControllers lastObject]; 

    // this line throws a "[MasterViewController topViewController]: unrecognized selector sent to instance 0x796dde90" 
    navigationController.topViewController.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem; 
    splitViewController.delegate = self; 
    return YES; 
} 

odtworzyć błąd:

  • Otwórz Xcode 6
  • File> New> Project
  • Wybierz "master-Nakładanie" poniżej "aplikacji iOS"
  • Zmień docelową projektu do 7,0
  • Run w emulatorze lub urządzenia

że zbadane i wydaje się, że różni się od typów obiektów iOS 7 i 8: iOS

  • Na systemów iOS 8, self.window.rootViewController jest UISplitViewController
  • Na iOS7, ja .window.rootViewController jest pierwszym UINavigationController (po lewej)

Dlaczego to zachowanie?

+0

Czy testujesz na iPhonie lub iPadzie? –

Odpowiedz

3

spróbować tej wymiany:

if ([splitViewController respondsToSelector:@selector(displayModeButtonItem)]){ 
    navigationController.topViewController.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem; 
} 
+1

Działa, ale teraz mam tylko widok "master". Nigdy więcej widoku "szczegółowego". –

+0

ah ok, więc potrzebujemy else {}, aby poradzić sobie z pre iOs8. Niestety nie mam projektu podzielonego widoku, przepraszam. Muszę spojrzeć na szablon splitView z xCode5 – Jef

+0

Aktualnie pobieram xCode 5, aby przetestować go. –

3

Umieść to pod prepareForSegue:, aby zapewnić kompatybilność wsteczną.

DetailViewController *controller; 
    if ([[segue destinationViewController] isKindOfClass:[UINavigationController class]]) { 
     controller = (DetailViewController *)[[segue destinationViewController] topViewController]; 
    } 
    else { 
     controller = (DetailViewController *)[segue destinationViewController]; 
    } 
[controller setDetailItem:object]; 
1

displayModeButtonItem działa tylko w systemie iOS 8 lub nowszym.

Powiązane problemy