Panggilan tidak seimbang untuk memulai / mengakhiri transisi tampilan untuk <FirstViewController: 0x2a2c00>

93

Saya mengalami masalah ini ketika saya mensimulasikan aplikasi saya, ini bukan kesalahan atau peringatan tetapi muncul di konsol saya, apakah ada yang pernah mengalami ini sebelumnya?

C. Yohanes
sumber
apakah Anda membuat semacam animasi di pengontrol tampilan itu?
1
Iya. Saya memiliki animasi pembuka yang bergeser ke gambar terpisah, sekarang saya perhatikan kesalahan ini hanya terjadi ketika saya memuat kode ke telepon.
C. Johns
pesan kesalahan menyarankan Anda untuk memulai transisi tetapi ada panggilan yang hilang ke metode akhir yang sesuai.
1
Punya hal yang sama. Ada solusi untuk ini?
seeafish
Juga mencari resolusi untuk ini
barfoon

Jawaban:

48

Dalam kasus saya, kesalahan ini terjadi ketika Anda mengklik dua tab dalam tampilan tabel dengan sangat cepat.

Hasilnya menyebabkan nama judul salah, tombol kembali menghilang. Seseorang menyebutkan bahwa ketika Anda mendorong pandangan set animated:NO,. Kesalahan akan hilang tetapi masih menyebabkan beberapa perilaku aneh. Ini mendorong dua tampilan, lalu Anda harus mundur dua kali untuk kembali ke layar tampilan tabel.

Metode yang saya coba untuk menyelesaikan masalah ini:

Menambahkan BOOL cellSelected;

di viewWillAppear cellSelected = YES;

dalam delegasi didselectcell if (cellSelected){cellSelected = NO; do action ; }

Ini membantu mencegah mengklik dua sel berbeda dengan sangat cepat.

chings228
sumber
5
Dugaan saya adalah beberapa kata yang sulit dimengerti. Saya membuat beberapa pengeditan untuk meningkatkan keterbacaan.
Kyle Clegg
42

Dalam kasus saya itu terjadi ketika saya dipicu [self performSegueWithIdentifier:@"SomeIdentifier" sender:self];dalam metode UINavigationControlleritem viewDidLoad.

Memindahkannya ke dalam viewDidAppearmetode memecahkan masalah.

Alasannya sangat mungkin adalah bahwa viewDidLoadtidak semua animasi mewah sudah selesai, sedangkan viewDidAppearsemuanya sudah selesai.

tttthomasssss
sumber
Terima kasih. Saya tersesat di era manusia gua di mana saya membuat setiap elemen UI melalui kode. Hal-hal storyboard baru bagi saya.
Kiran Kulkarni
21

Saya punya masalah ini juga. Saya menemukan dua solusi untuk masalah ini:

  1. Anda dapat melihat solusi ini di atas.
  2. Saya menemukan subkelas UINavigationControllertempat masalah ini teratasi. Pengontrol Navigasi Buffered
Igor_CodabraSoft
sumber
15

Anda harus menjalankan kode Anda di loop yang berbeda untuk menghindari ini

 double delayInSeconds = 0.1;
        dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
        dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
            // Put your code here
[self presentViewController:self.yourModalVC animated:YES completion:nil];
        });
prohuutuan
sumber
7
Ide yang lebih baik adalah memasukkan animasi presentasi ke dalam dispatch_asyncantrian utama. Hal tentang dispatch_asyncitu menunggu sampai semua animasi lain di antrian utama selesai. itu jauh lebih baik daripada menggunakan penundaan karena: 1- Anda tidak akan pernah tahu apakah penundaan sudah cukup, itu tergantung pada perangkat host Anda 2- Anda akan berakhir dengan penundaan berlebihan dan sesuatu akan tertinggal. coba ini:dispatch_async(dispatch_get_main_queue(), ^{[self presentViewController:self.yourModalVC animated:YES completion:nil];});
M. Porooshani
12

Saya punya banyak masalah dengan masalah yang sama. Saya menyelesaikan ini dengan cara ini

1) Anda tidak menggunakan UIViewController'spenginisialisasi yang ditunjuk initWithNibName:bundle:. Coba gunakan, bukan hanya init.

2) diatur animated:YESke TIDAK, dan itu memecahkan masalah. misalnya.[self.navigationController pushViewController: viewController_Obj animated:NO];

kunalg
sumber
7

Saya memiliki masalah yang sama menggunakan pengontrol navigasi dan mendorong pengontrol lain ke sana. Saya mencoba menggunakan Buffered Navigation Controller dan beberapa pendekatan lainnya, tetapi tidak berhasil untuk saya. Setelah menghabiskan beberapa waktu untuk mengetahuinya, saya perhatikan bahwa masalah ini terjadi jika Anda mencoba mendorong pengontrol tampilan baru saat transaksi sebelumnya (animasi) sedang berlangsung (kira-kira durasi 0,5 detik). Bagaimanapun, saya membuat solusi cepat dengan mendelegasikan pengontrol navigasi dan menunggu animasi sebelumnya selesai.

dimanitm
sumber
Terima kasih! Memindahkan logika saya ke viewDidAppear membantu dalam situasi saya.
Jaroslav
7

Pastikan Anda tidak lupa di -viewWillAppear, -viewDidAppear, -viewDidLoad, -viewWillDisappear, -viewDidDisappear untuk memanggil metode super yang tepat dalam kelebihan metode Anda. Misalnya dalam kasus saya, saya tidak cocok dengan nama metode seperti ini:

-(void)viewDidAppear
{
 [super viewDidDisappear];
 //some code staff
 ..
}

perhatikan bahwa metode muncul dan menghilang tidak cocok

Nikolay Shubenkov
sumber
Hanya menghabiskan waktu sekitar dua jam untuk men-debug masalah ini dan ternyata seperti inilah. Memanggil di super.viewWillAppear()dalam viewDidDisappear().
Daniel Wood
Terima kasih atas tip ini. Itu bukan satu-satunya masalah saya, tapi itu membantu!
Anthony C
4

'Panggilan tidak seimbang untuk memulai / mengakhiri transisi tampilan'

Mengatakan animasi dimulai sebelum animasi terkait terakhir tidak selesai. Jadi, apakah Anda memunculkan pengontrol tampilan sebelum mendorong yang baru? Atau mungkin muncul ke root? jika ya coba lakukan tanpa animasi yaitu[self.navigationController popToRootViewControllerAnimated:NO];

Dan lihat apakah ini menyelesaikan masalah, Dalam kasus saya ini berhasil.

infiniteLoop
sumber
1
Ini kuncinya: pop atau ubah transisi viewcontroller lain pada saat yang bersamaan.
Rocky
2

Saya mendapat masalah ini karena saya memanggil UIPrintInteractionController dari viewController tanpa UITabbar, dan juga UINavigationBar. Tampaknya UIPrintInteractionController tidak mendapatkan printInteractionControllerParentViewController yang benar. Menerapkan metode dalam delegasi dan mengembalikan rootViewController saat ini berhasil untuk saya.

    - (UIViewController*)printInteractionControllerParentViewController:(UIPrintInteractionController*)printInteractionController;
balooka
sumber
2

Saya memiliki masalah serupa yang melibatkan memutar ulang dialog modal. Posting solusinya di sini ...

https://stackoverflow.com/a/38795258/324479

[Masalah]

Nav Controller -> VC1 -Push -> VC2 -PopOver atau Modal Segue -> VC3.

VC3 melepas kembali ke VC1.

Ketika Segue dari VC2 ke VC3 adalah PopOver dan Modal, pelepasan berakhir dengan peringatan: Panggilan tidak seimbang untuk memulai / mengakhiri transisi tampilan untuk UIViewController "

Jika Segue dari VC ke VC didorong, peringatan itu hilang.

[Larutan]

Akan lebih bagus jika logika santai akan menangani ini. Mungkin itu bug, mungkin tidak. Apa pun caranya, solusinya adalah menjadikan VC2 (Pengontrol yang memiliki munculan) sebagai target mundur, lalu tunggu hingga selesai muncul sebelum memunculkan pengontrol nav. Itu memastikan animasi mundur (popup terbalik) memiliki cukup waktu untuk menyelesaikan sebelum bergerak mundur lebih jauh. Bahkan dengan animasi mati, itu masih harus menunggu atau Anda mendapatkan kesalahan.

Kode Anda untuk VC2 harus sebagai berikut. (Cepat)

class VC2: UIViewController {
    private var unwind = false
    @IBAction func unwindToVC1(segue:UIStoryboardSegue) {
        unwind = true
    }

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)

        if unwind {
            self.navigationController?.popViewControllerAnimated(false)
        }
    }
}
Carter Medlin
sumber
1

Situasi ini dapat terjadi jika Anda menambahkan tampilan dengan pengontrol tampilan modal sebagai tampilan sub. Terbaik untuk digunakan:

-(void) viewDidAppear:(BOOL)animated {
    [self presentViewController:self.yourModalVC animated:YES completion:nil];
}

Ini pada dasarnya mengatakan bahwa siklus hidup tampilan tidak efisien untuk viewControllers yang Anda coba tampilkan kemudian.

elliotrock.dll
sumber
1

Saya memiliki masalah serupa saat mencoba melakukan:

[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:2] animated:YES];

dalam fungsi seperti - (void) popUpToLevelTwo;, dan untuk meletakkan return;di akhir fungsi memecahkan masalah

BabyPanda
sumber
1

Saya juga mendapatkan ini di

[self dismissModalViewControllerAnimated:YES];

Saya mengubah YESke a NO, dan itu menyelesaikan masalah.

DD.amor
sumber
1

saya memiliki masalah yang sama ketika saya menggunakan metode pop navigationcontroller Dalam aplikasi saya, saya menggunakan logika terpisah untuk pengontrol navigasi, Jadi hindari penggunaan bilah navigasi dan selalu tersembunyi. Kemudian saya menggunakan tampilan dan pemberitahuan khusus untuk menangani tombol belakang dan kejadiannya. pengamat notifikasi terdaftar dan dan tidak dihapus. Jadi, notifikasi terpicu dua kali, dan itu menciptakan kesalahan yang disebutkan di atas. Periksa kode Anda secara menyeluruh untuk mengetahui kesalahan seperti itu

Dileep stanley
sumber
1

Untuk apa nilainya, saya mendapatkan kesalahan yang sama ini ketika tidak menyertakan panggilan ke [super viewDidLoad:animated]dalam viewDidLoadpenggantian saya .

raeldor
sumber
1
yang Anda maksud adalah viewDidAppear? viewDidLoad tidak memiliki parameter
Fabio Napodano
1

Saya juga mengalami masalah ini ketika saya mengetuk tombol dari NIB. Ternyata saya tidak sengaja menghubungkan tombol untuk mengirim acara ke dua metode IBAction, yang masing-masing melakukan pushViewController: animated:

Martin Lockett
sumber
Terima kasih !! Anda menghemat waktu saya !!
VD
1

Saya memiliki beberapa logika yang diimplementasikan untuk menunggu mendorong UIViewControllerhingga semua data diunduh. Terjadi kesalahan dalam logika ini yang menyebabkan mendorongUIViewController terlalu awal sementara masih ada panggilan API lain yang sedang berlangsung.

Itu menyebabkan hal yang sama UIViewControllerdidorong dua kali oleh UINavigationControllerdan memberikan peringatan ini.

Jasper
sumber
1

Alasan Untuk pesan: Pesan ini bisa ditampilkan jika dan hanya jika Anda mendorong / menyajikan View controller lain dari viewWillAppear, loadView, initatau viewDidLoadmetode arus View Controller

Cara untuk Menghapus Pesan kesalahan: Pindahkan kode mendorong / presentasi Anda ke viewDidAppearmetode akan menyelesaikan masalah

Mehul Thakkar
sumber
1

Cepat 4

Masalah saya adalah bahwa saya mempresentasikan VC lain sebelum VC saya yang sekarang selesai dirender.

Solusinya adalah menyajikan VC saya berikutnya setelah penundaan yang cepat.

APA YANG HARUS ANDA JANGAN LAKUKAN

override func viewDidLoad() {
    super.viewDidLoad() 
    self.present(MyNextVC(), animated: true, completion: nil)
}

APA YANG HARUS ANDA LAKUKAN

override func viewDidLoad() {
    super.viewDidLoad() 
    //Wait until the view finished to be constructed
    perform(#selector(showMyNextVC), with: nil, afterDelay: 0.01)
}

@objc func showCityList() {
    self.present(MyNextVC(), animated: true, completion: nil)
}
Ugo Marinelli
sumber
1
Daripada menggunakan penundaan, saya akan meletakkan kode di viewDidAppear atau viewDidLayoutSubviews.
Pranav Kasetti
0

Saya mengalami masalah ini ketika saya lupa mengatur Break; setelah mendorong tampilan dalam pernyataan switch!

Seperti di sini:

case 1:{

        SomeViewController *someViewController = [[SomeViewController alloc]initWithNibName:@"SomeViewController" bundle:Nil];
        [self.navigationController pushViewController:someViewController animated:YES];
        [someViewController release];
    }

        break; //Forgetting to set break here:
Alex McPherson
sumber
0

alasan di balik kesalahan "Panggilan tidak seimbang untuk memulai / mengakhiri transisi tampilan" adalah saat Anda menavigasi | segue dua kali pada saat bersamaan

poa
sumber
0

salah satu solusinya adalah,

[NSTimer scheduledTimerWithTimeInterval:0.05(or as required) target:self
selector:@selector(your_selector_method_to_push_the_view) userInfo:nil repeats:NO];
pengguna3390994
sumber
0

Anda dapat mengalami ini jika Anda mencoba menutup UIViewController sebelum selesai memuat.

Saya memiliki pesan ini di konsol dan berfokus sepenuhnya pada UIViewController yang menghadirkan UIViewController baru, tanpa hasil. Saya akhirnya menemukan masalahnya ada di UIViewController yang saya tunjukkan sedang ditutup sendiri karena pengguna tidak masuk ke akun mereka.

Semoga ini bisa membantu seseorang.

Mark Hennings
sumber
0

Ini adalah hal yang sulit bagi saya: Saya telah menimpa

override func shouldAutomaticallyForwardRotationMethods() -> Bool {
    return true
}

tanpa menimpa:

override func shouldAutomaticallyForwardAppearanceMethods() -> Bool {
    return true
}

di pengontrol navigasi akar jendela saya. kemudian pengontrol navigasi anak mengeluh saat mendorong pengontrol tampilan lain dengan peringatan yang disebutkan di atas. Peringatan itu bukan yang terburuk, masalah besarnya adalah, bahwa di sana delegasi pengontrol navigasi anak tidak dipanggil lagi. lelah.

heiko
sumber
0

Dalam kasus saya, saya mengambil NSDatadari NSURLdalam viewDidLoadmetode.

BhushanVU
sumber