Konstruktor interfejsu Xcode 6 ma domyślnie nowe pole wyboru „użyj klas wielkości”. Sprawia, że widoki są adaptacyjne.
Kiedy próbuję przejść między 2 widokami w moim storyboardzie, mam nowe opcje:
zamiast starego:
Teraz mamy „pokaż” i „obecny modalnie” zamiast „wypychania” i „modalnie”. Stare opcje są oznaczone jako przestarzałe. Wybrałem opcję "pokaż", ponieważ w ustawieniach segue nazywa się to "pokaż (np. Push)
Ale to nie powoduje nacisku. Animacja przejścia wygląda jak slajd od dołu (modalna), a pasek nawigacji znika.
Pytanie brzmi: Jak sprawić, by „show” działało jak push? Czy jest to możliwe, czy powinienem zamiast tego użyć opcji „push (przestarzałe)”? Gdzie mogę znaleźć informacje o nowych typach segue? Jedyne, co znalazłem w bibliotece deweloperskiej iOS8, to Storyboards Help You Design Your User Interface, ale nie ma informacji o „show” segue.
AKTUALIZACJA
Próbowałem stworzyć nowy projekt i „show” działa jak „push”. Myślę, że problem w moim projekcie może wynikać z tego, że ponownie używam kontrolera nawigacji z takim kodem, ale nie wiem, jak to naprawić.
if ( [segue isKindOfClass: [SWRevealViewControllerSegue class]] ) {
SWRevealViewControllerSegue *swSegue = (SWRevealViewControllerSegue*) segue;
swSegue.performBlock = ^(SWRevealViewControllerSegue* rvc_segue, UIViewController* svc, UIViewController* dvc) {
UINavigationController* navController = (UINavigationController*)self.revealViewController.frontViewController;
[navController setViewControllers: @[dvc] animated: NO ];
[self.revealViewController setFrontViewPosition: FrontViewPositionLeft animated: YES];
};
}
Następnie próbuję wypchnąć NewViewController po MainViewController
AKTUALIZACJA 2:
Wydaje mi się, że dotyczy to tylko iOS 7, iOS 7.1.
źródło
Jest już zaakceptowana odpowiedź, ale chciałem podać trochę więcej informacji, być może informacji, które wcześniej nie były dostępne.
Jak wspomniano wcześniej, segmenty „push” i „modal” zostały wycofane i zostały zastąpione odpowiednio przez „show” i „present modally”. Zgodnie z dokumentacją Apple, nowe segmenty zostały dodatkowo podzielone na segmenty, które dostosowują się do klas wielkości. Starsze powinny być używane tylko do obsługi wersji iOS starszych niż iOS 8.
Dokument w poniższym linku wyjaśnia to i opisuje wszystkie dostępne segmenty, stare i nowe.
Dodawanie przejścia między scenami w scenorysie
W przypadku zmiany adresu URL w przyszłości, oto wyjaśnienie podane dla każdego nowego segmentu:
źródło
Nie ma nic złego w innych odpowiedziach, ale ta wyjaśnia, co się dzieje, w jaki sposób można zweryfikować, że tak się dzieje i jak złagodzić problem w przyszłości.
tło
W moim przypadku żaden z moich kanałów pokazowych nie działał, mimo że miałem już UINavigationController jako mój początkowy kontroler widoku (z moją zawartością UIViewController jako root).
Dlaczego i jak psuje się Show Segue
Przejście pokazu zrywa się, gdy ma akcję skojarzoną z płynnością w źródłowym pliku XML scenorysu. Typowy scenariusz, który to powoduje, może mieć miejsce, jeśli przedefiniowałeś płynność z ręcznej ścieżki poprzednio wywołanej w kodzie. Pozostawia to następujące bity w pliku storyboard xml.
Aby dostosować się do wszelkich niestandardowych działań podczas korzystania z płynności ze scenorysu, można po prostu dotknąć przygotujForSegue i przechwycić kontroler widoku docelowego i wywołać dowolne metody z tej lokalizacji. W każdym razie efektem ubocznym tego małego błędu (błąd polega na tym, że kiedy przedefiniujesz ścieżkę, nie jest ona poprawnie ustawiona w xml ~, tj. Akcja pozostaje nawet po zmianie ścieżki na taką, która działa z UIView (lub UIControl) do docelowego kontrolera widoku).
Niestety najbardziej bezpośrednie rozwiązanie zawodzi. Więc samo usunięcie atrybutu xml dla akcji z poziomu Storyboard NIE rozwiąże problemu. Zamiast tego należy po prostu usunąć i odtworzyć płynność w scenorysie.
Po odtworzeniu plik xml storyboardu nie będzie już miał akcji związanej z konkretnym płynem, a Pokaz zostanie wykonany jako Push.
Przykładowy plik XML dla prawidłowego Pokaż płynne
Łagodzenie
Aby zapobiec ponownemu wystąpieniu, wystarczy trzymać się nie-ręcznych fragmentów scenorysu, jeśli to możliwe, za pomocą przygotowaniaForSegue, aby dodać wymagane akcje na podstawie kontrolera widoku docelowego. Lub jeśli musisz wymieszać i dopasować, podejmij środki ostrożności, aby sprawdzić, czy Twoje segmenty Pokazu nie mają żadnych działań dołączonych do pliku storyboardu xml. Jeśli masz do czynienia ze starszymi projektami, powinieneś zwrócić szczególną uwagę na kod źródłowy Storyboard, ponieważ odkryłem kilka problemów.
źródło
Jak skomentował tutaj Scott Robertson , wygląda to na błąd w iOS 7.
Wygląda na to, że w iOS 8 przejście jest wywnioskowane w czasie wykonywania (prawidłowe zachowanie), podczas gdy w iOS 7 przejście jest wywnioskowane w czasie projektowania (zachowanie błędne).
Najprostszym obejściem jest dodanie nieużywanego kontrolera nawigacji do scenorysu i połączenie go w taki sposób, aby dany kontroler widoku był częścią tego kontrolera nawigacji. W rzeczywistości nie musisz tworzyć instancji kontrolera nawigacji, wystarczy, że błędny kontroler widoku będzie wiedział, że jest osadzony w kontrolerze nawigacji.
Uwaga: Symulacja paska nawigacji nie jest wystarczająca do tych celów; musisz mieć kontroler nawigacyjny w swoim stosie push.
Aby odtworzyć błąd:
initWithRootViewController:
metody.Aby naprawić błąd:
workaround for show segues in iOS 7
.).Zwróć uwagę, jak kontroler nawigacji został dodany na drugim obrazku i jak nie ma żadnych przychodzących strzałek (tj. Nie ma innego sposobu na jego utworzenie niż użycie identyfikatora kontrolera widoku).
źródło
Wiem, że się spóźniłem, ale chciałem podzielić się tym, czego się nauczyłem. W rzeczywistości jest to błąd i nadal występuje (18.12.2014).
Napisałem o tym artykuł tutaj .
Jest łatwo odtwarzalny; na iOS8 będzie działać dobrze, a nawet w iOS7.x, o ile nie wepchniesz programowo kontrolera widoku do stosu przed wywołaniem
Show
segue.Jeśli pchasz na stos tylko za pomocą połączeń scenorysu, zadziała; ale najwyraźniej jeśli w jakiś sposób wypchniesz za pomocą kodu,
navigationController
właściwość wypchniętego elementuUIViewController
będzie miała wartość,nil
a kiedy wywołaszShow
, przyjmie, że jest modalna, ponieważ nie ma nawigacji do kontrolowania stosu.Jedynym jak dotąd obejściem jest nie przekazywanie za pośrednictwem kodu (niewykonalne) lub używanie obecnie przestarzałego
Push
.Złożyłem radar (link do artykułu). Zapraszam do zgłaszania duplikatów z nadzieją, że Apple naprawi ten problem.
źródło
Show
odcinek, to na drugim odcinkuShow
jest prezentowany modalnie, Rozwiązanie?Show
kontrolera viewController na iOS 7Miałem ten sam problem z plikami segue w Xcode 7 i iOS 7.1.2. Pokaż segmenty (nowa funkcja z iOS 8) działa jak modalne segmenty w iOS 7 i nie pozwala na wypychanie kontrolerów widoku do stosu kontrolera nawigacji podczas definiowania typu ściegu za pomocą Xcode w Storyboard. Dlatego twój self.navigationController zwróci nil, ponieważ kontroler widoku nie został umieszczony na stosie i nie możesz go zdjąć.
Nie rozumiem, dlaczego Apple nie dodał żadnych powiadomień dla tego przypadku w Xcode, kiedy chcesz, aby Twoja aplikacja działała na iOS 7. Mówią, że metoda Push jest przestarzała, ale Show nie działa poprawnie z iOS 7.
Co zrobiłem, aby rozwiązać problem:
Stworzyłem klasę MYShowSegue z .h
Oraz plik .m z tylko jedną metodą wykonania :
Następnie musisz ustawić niestandardowy typ dla każdego ściegu w swoim Storyboard i wybrać dla niego nową klasę, w moim przypadku był to MYShowSegue.
Przykład niestandardowego odcinka
To rozwiązanie pomoże Ci uzyskać pełną obsługę aplikacji na iOS 7, będą one używać metody pushViewController do przesyłania Twoich widoków, a dla iOS 8,9 itd. Twoja segue będzie działać z nową metodą (iOS 8) showViewController
Nie zapomnij zrobić tego samego ze wszystkimi swoimi plikami w Storyboard.
źródło
Nadal dzieje się to w iOS 10.x.
Usunięcie i przywrócenie segmentów nie rozwiązało niczego dla mnie:
Problem: Wymagana funkcjonalność to 7 segmentów, które działają tylko jako „wypychanie” (w rzeczywistości szczegół pokazu), ale w rzeczywistości tylko pierwsza dodana przeze mnie ścieżka będzie wypychać, pozostałe będą zachowywać się modalnie. Dzieje się tak pomimo tego, że Interface Builder opisuje każdy z segmentów identycznie.
Rozwiązanie: musiałem dodać akcję do 6 segmentów, które jej nie miały.
Oryginalny plik XML scenorysu
Zmieniłem to, dodając showViewController: sender
źródło