"Aplikasi mencoba menyajikan pengontrol aktif secara sederhana"?

100

Saya baru saja menemukan error yang menunjukkan NSInvalidArgumentExceptionpesan ini di aplikasi yang tidak melakukan ini sebelumnya.

Aplikasi mencoba menyajikan pengontrol aktif UITabBarController: 0x83d7f00.

Saya memiliki UITabBarControlleryang saya buat di AppDelegatedan memberikannya array UIViewControllers.

Salah satunya saya ingin mempresentasikan secara sederhana ketika disadap. Saya melakukannya dengan menerapkan metode delegasi

- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController

Jika pengontrol tampilan itu dari kelas yang ingin saya sajikan secara sederhana, saya mengembalikan NO dan melakukannya

[tabBarController presentModalViewController:viewController animated:YES];

Dan sekarang saya mendapatkan kesalahan itu, yang tampaknya berarti bahwa Anda tidak dapat menyajikan secara sederhana pengontrol tampilan yang aktif di tempat lain (di tabbar ...) Saya harus mengatakan saya menggunakan XCode 4.2 Developer Preview 7, jadi ini adalah iOS 5 (Saya tahu tentang NDA, tapi saya rasa saya tidak memberikan rincian terlarang). Saat ini saya tidak memiliki penginstalan XCode untuk menguji apakah ini error saat dikompilasi terhadap SDK iOS4, tetapi saya hampir sepenuhnya yakin tidak.

Saya hanya ingin bertanya apakah ada yang mengalami masalah ini atau punya saran

Javier Soto
sumber
Sebelum iOS 5, ini tidak menimbulkan pengecualian, tetapi tidak menghasilkan apa-apa. Dari iOS 5, perintah ini memunculkan pengecualian.
Frédéric Adda

Jawaban:

103

Asumsikan Anda memiliki tiga pengontrol tampilan yang dibuat seperti ini:

UIViewController* vc1 = [[UIViewController alloc] init];
UIViewController* vc2 = [[UIViewController alloc] init];
UIViewController* vc3 = [[UIViewController alloc] init];

Anda telah menambahkannya ke bilah tab seperti ini:

UITabBarController* tabBarController = [[UITabBarController alloc] init];
[tabBarController setViewControllers:[NSArray arrayWithObjects:vc1, vc2, vc3, nil]];

Sekarang Anda mencoba melakukan sesuatu seperti ini:

[tabBarController presentModalViewController:vc3];

Ini akan memberi Anda kesalahan karena Tab Bar Controller memiliki pegangan kematian pada pengontrol tampilan yang Anda berikan. Anda tidak dapat menambahkannya ke larik pengontrol tampilan di bilah tab, atau Anda tidak dapat menyajikannya secara sederhana.

Apple mengharapkan Anda untuk memperlakukan elemen UI mereka dengan cara tertentu. Ini mungkin terkubur dalam Panduan Antarmuka Manusia di suatu tempat sebagai "jangan lakukan ini karena kami tidak mengharapkan Anda pernah ingin melakukan ini".

lswank
sumber
6
Masalahnya adalah ini sama sekali tidak ada masalah sebelum iOS 5, oleh karena itu perhatian saya! Apa yang saya lakukan adalah menambahkan UIViewController tiruan ke tabbar dan menyajikan secara sederhana contoh subkelas pengontrol tampilan aktual.
Javier Soto
1
@Iswank, sekarang di iOS 6, untuk membuat segalanya "lebih mudah," mereka menghentikan presentModalViewController yang menyebabkan semua jenis masalah rotasi ... Anda perlu menggunakan presentViewController: animasi: penyelesaian dan memeriksa bagaimana aplikasi Anda menangani perubahan
whyoz
15

Saya memiliki masalah yang sama. Saya mencoba menampilkan pengontrol tampilan setelah memberhentikan.

[self dismissModalViewControllerAnimated:YES];

Ketika saya mencoba melakukannya tanpa animasi, itu berfungsi dengan sempurna sehingga masalahnya adalah pengontrol masih hidup. Saya pikir solusi terbaik adalah menggunakan dismissViewControllerAnimated:completion:untuk iOS5

Danil
sumber
Gagal jika Anda mengabaikannya beranimasi karena pada saat Anda ingin menampilkan kembali pengontrol tampilan modal, pengontrol itu masih secara sederhana di layar, sedang dianimasikan.
Pascal
2
Itu dikurangi di iOS 6.0
Sumit Kumar Saha
12

Dalam kasus saya, saya mencoba untuk menyajikan viewController (saya memiliki referensi viewController di TabBarViewController) dari pengontrol tampilan yang berbeda dan itu menabrak pesan di atas. Dalam hal ini untuk menghindari presentasi, Anda dapat menggunakan

viewController.isBeingPresented

!viewController.isBeingPresented {
          // Present your ViewController only if its not present to the user currently.
}

Mungkin membantu seseorang.

Karthick Ramesh
sumber
ini bekerja hanya di viewWillappperar tetapi ketika saya telah memeriksanya sebelum menampilkan viewController yang sudah disajikan, itu selalu mengembalikan false.
guru
1
Tidak bekerja untuk saya. Masih mengalami crash aplikasi. (! viewController.presentingViewController) menyelesaikan masalah.
Argus
3

Saya memiliki masalah yang sama. Saya menyelesaikannya. Anda dapat mencoba kode ini:

[tabBarController setSelectedIndex:1];
[self dismissModalViewControllerAnimated:YES];
Erhan Demirci
sumber
2

Kesalahan masalah yang sama terjadi pada saya ketika saya mencoba presentpengontrol tampilan anak alih-alih UINavigationViewControllerinduknya

Nik
sumber
0

Hapus saja

[tabBarController presentModalViewController:viewController animated:YES];

dan simpan

[self dismissModalViewControllerAnimated:YES];
pengguna170317
sumber
ini memberikan peringatan yang tidak berlaku lagi ... jadi apa alternatifnya?
Kirtikumar A.
Di sini saya menggunakan [blockSelf rejectViewControllerAnimated: YES complete: nil];
Kirtikumar A.
0

Daripada menggunakan:

self.present(viewControllerToPresent: UIViewController, animated: Bool, completion: (() -> Void)?)

kamu bisa memakai:

self.navigationController?.pushViewController(viewController: UIViewController, animated: Bool)
Wimukthi Rajapaksha
sumber
0

Dalam kasus saya, saya sedang mempresentasikan rootViewControllersuatu UINavigationControllerketika saya seharusnya menampilkan UINavigationControllerdirinya sendiri.

Laura Corssac
sumber