2014-07-12 9 views
11

Aktualnie pracuję nad systemem iOS 8 i opracowuję aplikację z nowym adaptacyjnym środowiskiem. Dziwne jest to, że kiedy używam podzielonego kontrolera na iPhone'a z tą konfiguracją storyboardu, aplikacja nie zaczyna się od głównego kontrolera widoku, ale kontrolera szczegółów. Czy to błąd i jak mogę go naprawić? enter image description hereUżywanie narzędzia splitviewcontroller na iPhonie przedstawia najpierw widok szczegółów

Dzieje się tak tylko wtedy, gdy kontroler nawigacji, który otacza master, jeśli go usunę, aplikacja zacznie od kontrolera głównego.

+0

Czy znalazłeś jakieś rozwiązanie? Nawet mam ten sam problem. –

+0

Nie znalazłem rozwiązania problemu. Pamiętam z filmów WWDC, że widok podzielony zarządza wewnętrznie ruchem między kontrolerami nawigacyjnymi zarówno w widoku głównym, jak i szczegółowym. Najprawdopodobniej jest to błąd, ponieważ nawet hacki nie zapobiegają takiemu zachowaniu. Mogę się mylić. –

Odpowiedz

0

Prawdopodobnie jest to błąd spowodowany tym, że SplitViewController jest wyłącznie dla iPada. Również, gdy masz go w orientacji pionowej, domyślnie wyświetla widok szczegółów, a widok główny jest wyświetlany jako pasek. Trzeba będzie zmienić go za pomocą jakiegoś sposobu jak splitViewController:shouldHideViewController:inOrientation

Oto dokument Jabłko odnosząc problem

https://developer.apple.com/library/ios/documentation/uikit/reference/UISplitViewController_class/Reference/Reference.html

Mam nadzieję, że to pomoże!

+0

Bardzo dziękuję za odpowiedź –

+2

Ta odpowiedź jest nieaktualna - UISplitViewController nie jest już wyłączny od iOS 8, a używanie go w sposób, który pierwotnie opublikowałeś, jest oficjalnie rekomendowanym sposobem na uniwersalne aplikacje, które chcą mieć splitviews na iPadzie (i iPhone 6 Plus). – Marco

4

AKTUALIZACJA: Odpowiedź Michała Wybrowa jest lepsza.

wpadłem na ten problem i okazało się to do pracy:

splitViewController.viewControllers = 
    UIScreen.mainScreen.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClassCompact ? 
    @[ leftNavigationController ] : 
    @[ leftNavigationController, rightNavigationController ] 
; 

I delegata splitview:

- (UIViewController *)primaryViewControllerForCollapsingSplitViewController:(UISplitViewController *)splitViewController 
{ 
    return leftNavigationController; 
} 

- (UIViewController *)primaryViewControllerForExpandingSplitViewController:(UISplitViewController *)splitViewController 
{ 
    return leftNavigationController; 
} 

- (UIViewController *)splitViewController:(UISplitViewController *)splitViewController separateSecondaryViewControllerFromPrimaryViewController:(UIViewController *)primaryViewController 
{ 
    return rightNavigationController; 
} 

To straszne, wiem. Ale robi to dobrze, zwłaszcza na iPhone 6 Plus, co jest bardzo trudne, aby uzyskać prawo.

AKTUALIZACJA: Odpowiedź Michała Wybrowa jest lepsza.

10

Należy zdać sobie sprawę z tego, że gdy aplikacja kontrolera podzielonego widoku uruchamia się na telefonie iPhone 6 Plus w trybie portretowym, po prostu pokazuje kontroler widoku podzielonego w stanie zwiniętym. Domyślnie ma to szczegółowy widok wciśnięty powyżej dowolnego kontrolera widoku w głównym kontrolerze nawigacyjnym.

Sposób zatrzymania określonego widoku (takiego jak pusty widok szczegółów, który można początkowo pokazać na iPadzie) przed wyświetleniem podczas uruchamiania lub po jakimkolwiek obróceniu do pionu, polega na obsłużeniu tego w obiekcie splitViewController: collapseSecondaryViewController: onPrimaryViewController : Przekaż metodę. Zostanie on wywołany przy uruchomieniu na telefonie iPhone lub telefonie iPhone 6 Plus w pozycji pionowej przed prezentacją.

W ten sposób nie powinieneś potrzebować żadnego specyficznego dla urządzenia kodu.

W najprostszej postaci to będzie wyglądać:

- (BOOL)splitViewController:(UISplitViewController *)splitViewController collapseSecondaryViewController:(UIViewController *)secondaryViewController ontoPrimaryViewController:(UIViewController *)primaryViewController 
{ 
    if ([secondaryViewController isKindOfClass:[BlankViewController class]]) 
    { 
     // If our secondary controller is blank, do the collapse ourself by doing nothing. 
     return YES; 
    } 

    // Otherwise, use the default behaviour. 
    return NO; 
} 

Oczywiście, wtedy trzeba zrobić odwrotnie w splitViewController: separateSecondaryViewControllerFromPrimaryViewController: Aby utworzyć i zwracają BlankViewController dla nowego widoku wtórnym, jeśli nie chcesz, aby twój najwyższy główny kontroler widoku znalazł się po stronie szczegółów po rozwinięciu widoku podzielonego.

Bądź świadomy miksowania własnej implementacji z Apple w tych metodach, robią szalone rzeczy, takie jak osadzanie UINavigationControllers w innych kontrolerach UINavigationController.Zobacz moją odpowiedź pokrewną tutaj: https://stackoverflow.com/a/26090823/4089333