Czytałem SO o tym, że inny użytkownik napotkał podobny błąd , ale ten błąd jest w innym przypadku.
Otrzymałem tę wiadomość, gdy początkowo dodałem kontroler widoku:
Unbalanced calls to begin/end appearance transitions for
<UITabBarController: 0x197870>
Struktura aplikacji jest następująca:
Mam 5-zakładkowy TabBarController połączony z 5 kontrolerami widoku. Na początkowej karcie wyświetlania wzywam nowy kontroler widoku do nakładki jako wprowadzenie do aplikacji.
Używam tego kodu do wywołania kontrolera widoku wprowadzenia:
IntroVC *vc = [[IntroVC alloc] init];
[self presentModalViewController:vc animated:YES];
[vc release];
Po pojawieniu się tego IntroVC
kontrolera widoku pojawia się powyższy błąd.
ps Używam SDK xCode 4.2 i iOS 5.0, rozwijam aplikację na iOS 4.3.
ios
ios4
uitabbarcontroller
Raptor
źródło
źródło
Odpowiedzi:
Nie widząc więcej otaczającego kodu, nie mogę udzielić jednoznacznej odpowiedzi, ale mam dwie teorie.
Nie używasz
UIViewController
„s wyznaczony inicjatorinitWithNibName:bundle:
. Spróbuj go użyć zamiast po prostuinit
.Ponadto,
self
może być jednym z kontrolerów widoku na karcie Pasek kontrolera. Zawsze prezentuj kontrolery widoku z najwyższego kontrolera widoku, co oznacza w tym przypadku poproś kontroler paska kart o przedstawienie kontrolera widoku nakładki w imieniu kontrolera widoku. Nadal możesz zachować wszystkich delegatów wywołania zwrotnego do kontrolera widoku rzeczywistego, ale musisz mieć kontroler paska kart obecny i odrzucić.źródło
Naprawiłem ten błąd, zmieniając animację z TAK na NIE.
Z:
Do:
źródło
Jak opublikował danh
Możesz wygenerować to ostrzeżenie, przedstawiając modalne vc przed zakończeniem inicjalizacji aplikacji. tj. Uruchom aplikację szablonu aplikacji z zakładkami i przedstaw modalne vc na górze self.tabBarController jako ostatnią linię w aplikacji: didFinishLaunching. Pojawia się ostrzeżenie. Rozwiązanie: pozwól stosowi rozwinąć się najpierw, przedstaw modalne vc w innej metodzie, wywołanej za pomocą performSelector withDelay: 0.0
Spróbuj przenieść metodę do viewWillAppear i chroń ją, aby została wykonana tylko raz (zalecamy ustawienie właściwości)
źródło
viewWillAppear
a nieviewDidAppear
?Innym rozwiązaniem w wielu przypadkach jest upewnienie się, że przejście między
UIViewController
s nastąpi po zakończeniu nieodpowiedniej (np. Podczas inicjalizacji) procedury, wykonując:Jest to ogólne dla również
pushViewController:animated:
itp.źródło
Miałem ten sam problem. Wywołałem metodę
viewDidLoad
w moim pierwszymUIViewController
Wewnątrz sekundy
UIViewController
zrobiłem to samo również z opóźnieniem 0,5 sekundy. Po zmianie opóźnienia na wyższą wartość działało dobrze. To tak, jakby seksu nie można było wykonać zbyt szybko po kolejnym.źródło
viewDidAppear
abyUINavigationController
być gotowym do obsługi. Zmieniłem swój post na ten;)Miałem ten sam problem, gdy muszę przedstawić mój kontroler widoku logowania z innego kontrolera widoku. Jeśli użytkownik nie jest autoryzowany, zrobiłem to w metodzie ViewDidLoad mojego innego kontrolera widoku (jeśli nie jest autoryzowany -> presentModalViewController). Kiedy zacząłem robić to metodą ViewDidAppear, rozwiązałem ten problem. Myślę, że ViewDidLoad tylko inicjalizuje właściwości, a następnie zaczyna się faktyczny algorytm wyświetlania! Dlatego musisz użyć metody viewDidAppear, aby wykonać przejścia modalne!
źródło
Miałem ten problem z powodu literówki:
zamiast
Dzwonił „WillAppear” w super zamiast „DidAppear”
źródło
Miałem wiele problemów z tym samym problemem. Rozwiązałem to przez
Intro *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"introVC"];
[self.tabBarController presentModalViewController : vc animated:YES];
Mam kontroler widoku w moim storyboardzie, z jakiegoś powodu używanie tylko
[[introvc alloc] init];
nie działa dla mnie.źródło
Rozwiązałem to pisząc
źródło
Miałem ten problem z kodem strony trzeciej. Ktoś zapomniał ustawić super wnętrze viewWillAppear i viewWillDisappear w niestandardowej klasie TabBarController.
źródło
Jeśli używasz
transitioningDelegate
(nie ma to miejsca w przykładzie tego pytania), ustaw równieżmodalPresentationStyle
na.Custom
.Szybki
źródło
Miałem ten sam błąd. Mam pasek kart z 3 elementami i nieświadomie próbowałem wywołać główny kontroler widoku elementu 1 w elemencie 2 mojego paska kart za pomocą
performSegueWithIdentifier
.Dzieje się tak, że wywołuje kontroler widoku i wraca do głównego kontrolera widoku elementu 2 po kilku sekundach i rejestruje ten błąd.
Najwyraźniej nie można wywołać głównego kontrolera widoku elementu do innego elementu.
Więc zamiast
performSegueWithIdentifier
użyłem
[self.parentViewController.tabBarController setSelectedIndex:0];
Mam nadzieję, że to komuś pomoże.
źródło
Miałem ten sam problem i pomyślałem, że napiszę na wypadek, gdyby ktoś inny wpadł na coś podobnego.
W moim przypadku dołączyłem aparat rozpoznawania gestów długiego naciśnięcia do mojego UITableViewController.
W moim selektorze onLongPress uruchomiłem następny kontroler widoku.
W moim przypadku otrzymałem komunikat o błędzie, ponieważ aparat rozpoznawania długiego naciśnięcia odpalił więcej niż jeden raz, w wyniku czego mój „SomeViewController” został wielokrotnie wypchnięty na stos.
Rozwiązaniem było dodanie wartości logicznej, aby wskazać, kiedy SomeViewController został wypchnięty na stos. Kiedy moja metoda viewWillAppear UITableViewControllera została wywołana, ustawiłem wartość logiczną z powrotem na NO.
źródło
Odkryłem, że jeśli używasz storyboardu, będziesz chciał umieścić kod prezentujący nowy kontroler widoku w viewDidAppear. Pozbędzie się również ostrzeżenia „Odradza się prezentowanie kontrolerów widoku na odłączonych kontrolerach widoku”.
źródło
W Swift 2+ dla mnie działa:
Mam UITabBarViewController w scenorysie i mam taką właściwość selectedIndex:
Ale usuwam go i dodaję w mojej metodzie viewDidLoad mojej początkowej klasy, w ten sposób:
Mam nadzieję, że mogę komuś pomóc.
źródło
Właściwie musisz poczekać, aż animacja wypychania się zakończy. Możesz więc delegować UINavigationController i zapobiegać wypychaniu do zakończenia animacji.
źródło
Jak zasugerował @danh, moim problemem było to, że prezentowałem modalny vc, zanim
UITabBarController
był gotowy. Jednak czułem się nieswojo polegając na stałym opóźnieniu przed prezentacją kontrolera widoku (z moich testów potrzebowałem użyć opóźnienia 0,05-0,1 sperformSelector:withDelay:
). Moje rozwiązanie jest dodanie bloku, który jest wywoływana naUITabBarController
„sviewDidAppear:
metody:PRTabBarController.h:
PRTabBarController.m:
Teraz w
application:didFinishLaunchingWithOptions:
źródło
musisz upewnić się, że - (void) beginAppearanceTransition: (BOOL) isAppearing animated: (BOOL) animated i - (void) endAppearanceTransition są tworzone razem w klasie.
źródło
Miałem ten sam problem. Podczas tworzenia chciałem ominąć ekrany. Przechodziłem z jednego kontrolera widoku do drugiego w viewDidLoad, wywołując metodę selektora.
Problem polega na tym, że powinniśmy pozwolić ViewController zakończyć przejście przed przejściem do innego ViewController.
źródło
Szybki 5
źródło
Miałem ten problem, kiedy przechodziłem z głównego TVC do TVC A, a następnie do TVC B. Po naciśnięciu przycisku „załaduj” w TVC BI chciałem przejść od razu z powrotem do głównego TVC (nie ma potrzeby ponownego odwiedzania TVC A, więc po co to robić) . Miałem:
... co spowodowało błąd „Niezbalansowane wywołania do rozpoczęcia / zakończenia itd.”. Następujące czynności naprawiły błąd, ale brak animacji:
To było moje ostateczne rozwiązanie, bez błędu i nadal animowane:
źródło
Napotkałem ten błąd, kiedy podłączyłem UIButton do akcji typu segue scenorysu (w IB), ale później zdecydowałem, że przycisk programowo wywoła
performSegueWithIdentifier
zapominanie o usunięciu pierwszego z IB.W istocie dwukrotnie wykonał wywołanie płynności, dał ten błąd i faktycznie dwukrotnie popchnął mój widok. Rozwiązaniem było usunięcie jednego z połączeń przychodzących.
Mam nadzieję, że pomoże to komuś tak samo zmęczonemu jak ja!
źródło