Saya membaca SO tentang pengguna lain yang mengalami kesalahan serupa , tetapi kesalahan ini dalam kasus yang berbeda.
Saya menerima pesan ini ketika saya menambahkan View Controller pada awalnya:
Unbalanced calls to begin/end appearance transitions for
<UITabBarController: 0x197870>
Struktur aplikasi adalah sebagai berikut:
Saya mendapat TabBarController 5-tab yang ditautkan ke 5 View Controllers. Di tab tampilan awal, saya memanggil Pengontrol Tampilan baru untuk dihamparkan sebagai pengenalan aplikasi.
Saya menggunakan kode ini untuk memanggil pengontrol tampilan pengantar:
IntroVC *vc = [[IntroVC alloc] init];
[self presentModalViewController:vc animated:YES];
[vc release];
Setelah IntroVC
pengontrol tampilan ini muncul, kesalahan di atas muncul.
ps Saya menggunakan xCode 4.2 & iOS 5.0 SDK, mengembangkan aplikasi iOS 4.3.
ios
ios4
uitabbarcontroller
Raptor
sumber
sumber
Jawaban:
Tanpa melihat lebih banyak kode di sekitarnya, saya tidak dapat memberikan jawaban yang pasti, tetapi saya memiliki dua teori.
Anda tidak menggunakan
UIViewController
's ditunjuk initializerinitWithNibName:bundle:
. Coba gunakan, bukan hanyainit
.Juga,
self
mungkin salah satu pengontrol tampilan pengontrol tab bar. Selalu hadirkan pengontrol tampilan dari pengontrol tampilan paling atas, yang berarti dalam hal ini, minta pengontrol bilah tab untuk menampilkan pengontrol tampilan overlay atas nama pengontrol tampilan. Anda masih dapat menyimpan delegasi panggilan balik ke pengontrol tampilan nyata, tetapi Anda harus memiliki pengontrol bilah tab dan menutupnya.sumber
Saya memperbaiki kesalahan ini dengan mengubah animasi dari YES menjadi NO.
Dari:
Untuk:
sumber
Seperti yang diposting oleh danh
Anda dapat membuat peringatan ini dengan menampilkan modal vc sebelum aplikasi selesai diinisialisasi. yaitu Mulai aplikasi template aplikasi tab dan tampilkan modal vc di atas self.tabBarController sebagai baris terakhir dalam application: didFinishLaunching. Peringatan muncul. Solusi: biarkan tumpukan terlepas terlebih dahulu, tunjukkan modal vc dalam metode lain, yang dipanggil dengan performSelector withDelay: 0.0
Coba pindahkan metode ke viewWillAppear dan jaga agar bisa dijalankan hanya sekali (akan merekomendasikan menyiapkan properti)
sumber
viewWillAppear
tidakviewDidAppear
?Solusi lain untuk banyak kasus adalah memastikan bahwa transisi antara
UIViewController
s terjadi setelah prosedur yang tidak sesuai (seperti selama inisialisasi) selesai, dengan melakukan:Ini umum juga
pushViewController:animated:
, dll.sumber
Saya memiliki masalah yang sama. Saya memanggil metode di
viewDidLoad
dalam yang pertamaUIViewController
Di dalam detik
UIViewController
saya juga melakukan hal yang sama dengan penundaan 0,5 detik. Setelah mengubah penundaan ke nilai yang lebih tinggi, itu berfungsi dengan baik. Sepertinya segue tidak bisa dimainkan terlalu cepat setelah segue lain.sumber
viewDidAppear
sehinggaUINavigationController
siap untuk menanganinya. Saya mengubah posting saya menjadi ini;)Saya memiliki masalah yang sama ketika saya perlu Mempresentasikan Pengontrol Tampilan Login Saya dari Pengontrol Tampilan lain Jika Pengguna tidak berwenang, saya melakukannya dalam Metode ViewDidLoad dari Pengontrol Tampilan Lain saya (jika tidak diotorisasi -> presentModalViewController). Ketika saya mulai membuatnya dalam metode ViewDidAppear, saya memecahkan masalah ini. Saya pikir ViewDidLoad hanya menginisialisasi properti dan setelah itu algoritma tampilan yang sebenarnya dimulai! Itulah mengapa Anda harus menggunakan metode viewDidAppear untuk membuat transisi modal!
sumber
Saya mengalami masalah ini karena salah ketik:
dari pada
Itu memanggil "WillAppear" di super, bukan "DidAppear"
sumber
Saya punya banyak masalah dengan masalah yang sama. Saya menyelesaikan yang satu ini dengan
Intro *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"introVC"];
[self.tabBarController presentModalViewController : vc animated:YES];
Saya memiliki viewcontroller di storyboard saya, untuk beberapa alasan hanya menggunakan
[[introvc alloc] init];
tidak berhasil untuk saya.sumber
Saya menyelesaikannya dengan menulis
sumber
Saya mengalami masalah ini dengan kode pihak ketiga. Seseorang lupa menyetel super di dalam viewWillAppear dan viewWillDisappear di kelas TabBarController kustom.
sumber
Jika Anda menggunakan
transitioningDelegate
(bukan kasus dalam contoh pertanyaan ini), setel jugamodalPresentationStyle
ke.Custom
.Cepat
sumber
Saya mengalami kesalahan yang sama. Saya memiliki bilah tab dengan 3 item dan saya secara tidak sadar mencoba memanggil pengontrol tampilan root item 1 di item 2 dari bilah tab saya menggunakan
performSegueWithIdentifier
.Apa yang terjadi adalah ia memanggil pengontrol tampilan dan kembali ke pengontrol tampilan root dari item 2 setelah beberapa detik dan mencatat kesalahan itu.
Rupanya, Anda tidak dapat memanggil pengontrol tampilan root dari suatu item ke item lain.
Jadi, bukan
performSegueWithIdentifier
Saya dulu
[self.parentViewController.tabBarController setSelectedIndex:0];
Semoga ini bisa membantu seseorang.
sumber
Saya memiliki masalah yang sama dan berpikir saya akan memposting jika ada orang lain yang mengalami hal serupa.
Dalam kasus saya, saya telah memasang pengenal gerakan tekan lama ke UITableViewController saya.
Di pemilih onLongPress saya, saya meluncurkan pengontrol tampilan berikutnya.
Dalam kasus saya, saya menerima pesan kesalahan karena pengenal pers lama ditembakkan lebih dari satu kali dan sebagai hasilnya, "SomeViewController" saya didorong ke tumpukan beberapa kali.
Solusinya adalah menambahkan boolean untuk menunjukkan kapan SomeViewController telah didorong ke tumpukan. Ketika metode viewWillAppear UITableViewController saya dipanggil, saya menyetel boolean kembali ke NO.
sumber
Saya menemukan bahwa, jika Anda menggunakan storyboard, Anda akan ingin meletakkan kode yang menampilkan pengontrol tampilan baru di viewDidAppear. Ini juga akan menghilangkan peringatan "Menampilkan pengontrol tampilan pada pengontrol tampilan terpisah tidak disarankan".
sumber
Di Swift 2+ untuk saya bekerja:
Saya memiliki UITabBarViewController di storyboard dan saya telah memilih propertiIndex seperti ini:
Tapi saya menghapusnya, dan menambahkan metode viewDidLoad kelas awal saya, seperti ini:
Saya harap saya dapat membantu seseorang.
sumber
Sebenarnya Anda perlu menunggu sampai animasi push berakhir. Jadi, Anda dapat mendelegasikan UINavigationController dan mencegah dorongan hingga animasi berakhir.
sumber
Seperti yang disarankan @danh, masalah saya adalah saya mempresentasikan modal vc sebelum
UITabBarController
siap. Namun, saya merasa tidak nyaman mengandalkan penundaan tetap sebelum menampilkan pengontrol tampilan (dari pengujian saya, saya perlu menggunakan penundaan 0,05-0,1 detikperformSelector:withDelay:
). Solusi saya adalah menambahkan blok yang dipanggil padaUITabBarController
'sviewDidAppear:
metode:PRTabBarController.h:
PRTabBarController.m:
Sekarang di
application:didFinishLaunchingWithOptions:
sumber
Anda perlu memastikan - (void) beginAppearanceTransition: (BOOL) isAppearing animated: (BOOL) animated dan - (void) endAppearanceTransition dibuat bersama di kelas.
sumber
Saya memiliki masalah yang sama. Saat mengembangkan saya ingin melewati layar. Saya menavigasi dari satu pengontrol tampilan ke yang lain di viewDidLoad dengan memanggil metode pemilih.
Masalahnya adalah kita harus membiarkan ViewController menyelesaikan transisi sebelum beralih ke ViewController lain.
sumber
Cepat 5
sumber
Saya mengalami masalah ini ketika saya telah menavigasi dari TVC root ke TVC A lalu ke TVC B. Setelah mengetuk tombol "muat" di TVC BI ingin langsung kembali ke TVC root (tidak perlu mengunjungi kembali TVC A jadi mengapa melakukannya) . Saya punya:
... yang memberikan kesalahan "Panggilan tidak seimbang untuk memulai / mengakhiri, dll". Hal berikut memperbaiki kesalahan, tetapi tidak ada animasi:
Ini adalah solusi terakhir saya, tidak ada kesalahan dan masih beranimasi:
sumber
Saya mengalami kesalahan ini ketika saya mengaitkan UIButton ke aksi segue storyboard (dalam IB) tetapi kemudian memutuskan untuk memiliki tombol yang secara terprogram memanggil
performSegueWithIdentifier
lupa untuk menghapus yang pertama dari IB.Intinya itu melakukan panggilan segue dua kali, memberikan kesalahan ini dan benar-benar mendorong pandangan saya dua kali. Cara mengatasinya adalah menghapus salah satu panggilan segue.
Semoga ini bisa membantu seseorang yang lelah seperti saya!
sumber