"Uygulama mod olarak aktif bir denetleyici sunmaya çalıştı" mı?


101

Daha NSInvalidArgumentExceptionönce bunu yapmayan bir uygulamada bu mesajla birlikte bir kilitlenme ile karşılaştım.

Uygulama modsal olarak etkin bir UITabBarController denetleyicisi sunmaya çalıştı: 0x83d7f00.

Bir tane UITabBarControlleryarattığım var AppDelegateve ona dizisini veriyorum UIViewControllers.

Bunlardan biri üzerine dokunduğumda modsal olarak sunmak istiyorum. Temsilci yöntemini uygulayarak bunu yaptım

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

Bu görünüm denetleyicisi modsal olarak sunmak istediğim sınıfın içindeyse, NO döndürür ve yaparım

[tabBarController presentModalViewController:viewController animated:YES];

Ve şimdi bu hatayı alıyorum, bu da başka bir yerde aktif olan bir görünüm denetleyicisini modsal olarak sunamayacağınız anlamına geliyor (sekme çubuğunda ...) XCode 4.2 Developer Preview 7'de olduğumu söylemeliyim, yani bu iOS 5 (NDA'yı biliyorum, ancak herhangi bir yasak ayrıntı vermediğimi düşünüyorum). Şu anda iOS4 SDK'ya karşı derlemenin çöküp çökmediğini test etmek için bir XCode kurulumum yok, ancak neredeyse tamamen eminim.

Sadece birinin bu sorunu yaşayıp yaşamadığını veya herhangi bir önerisi olup olmadığını sormak istedim


İOS 5'ten önce, bu bir istisna yaratmadı, ancak hiçbir şey döndürmedi. İOS 5'ten itibaren bu komut bir istisna yaratır.
Frédéric Adda

Yanıtlar:


104

Şu şekilde örneklenmiş üç görünüm denetleyiciniz olduğunu varsayalım:

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

Bunları aşağıdaki gibi bir sekme çubuğuna eklediniz:

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

Şimdi böyle bir şey yapmaya çalışıyorsun:

[tabBarController presentModalViewController:vc3];

Bu size bir hata verecektir çünkü Sekme Çubuğu Denetleyicisinin verdiğiniz görüntü denetleyicisinde bir ölüm tutuşu vardır. Bunu sekme çubuğundaki görünüm denetleyicileri dizisine ekleyemezsiniz veya mod olarak sunamazsınız.

Apple sizden kullanıcı arayüzü öğelerini belirli bir şekilde işlemenizi bekler. Bu muhtemelen İnsan Arayüzü Kılavuzlarında "bunu yapmayın çünkü bunu yapmak istemenizi asla beklemiyoruz" olarak gömülüdür.


6
Sorun şu ki, iOS 5'ten önce kesinlikle sorun değildi, bu yüzden endişem! Yaptığım şey, sekme çubuğuna sahte bir UIViewController eklemek ve modsal olarak gerçek görünüm denetleyicisi alt sınıf örneğini sunmaktı.
Javier Soto

1
@Iswank, şimdi iOS 6'da, işleri "kolaylaştırmak" için, presentModalViewController'ı kullanımdan kaldırarak her türlü rotasyonel soruna neden oldu ... presentViewController'ı kullanmanız gerekir: animasyonlu: tamamlama ve uygulamanızın değişiklikleri nasıl işlediğini kontrol edin
whyoz

15

Bende de aynı sorun var. Görevden çıkardıktan hemen sonra görüntüleme denetleyicisini sunmaya çalışıyorum.

[self dismissModalViewControllerAnimated:YES];

Bunu animasyon olmadan yapmaya çalıştığımda mükemmel çalışıyor, bu yüzden sorun denetleyicinin hala hayatta olması. En iyi çözümün dismissViewControllerAnimated:completion:iOS5 için kullanmak olduğunu düşünüyorum


Eğer modal görünüm kontrolörünü tekrar sunmak istediğinizde, modal olarak hala ekranda olup animasyonlu olarak kapatırsanız başarısız olur.
Pascal

2
IOS 6.0
Sumit Kumar Saha

12

Benim durumumda, viewController'ı (TabBarViewController'daki viewController referansına sahibim) farklı görünüm denetleyicilerinden sunmaya çalışıyordum ve yukarıdaki mesajla çöküyordu. Bu durumda sunum yapmaktan kaçınmak için kullanabilirsiniz

viewController.isBeingPresented

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

Birine yardımcı olabilir.


yalnızca viewWillappperar'da çalışıyor, ancak zaten sunulan viewController'ı sunmadan önce kontrol ettiğimde, her zaman false döndürüyor.
guru

1
Benim için çalışmıyor. Hala uygulama çöküyor. (! viewController.presentingViewController) sorunu çözdü.
Argus

3

Ben de aynı sorunu yaşadım, çözdüm. Bu kodu deneyebilirsiniz:

[tabBarController setSelectedIndex:1];
[self dismissModalViewControllerAnimated:YES];

3

Aynı sorun hatası present, UINavigationViewControllerebeveyn yerine bir çocuk görüntüleme denetleyicisini denediğimde de başıma geldi


0

Sadece kaldır

[tabBarController presentModalViewController:viewController animated:YES];

Ve tut

[self dismissModalViewControllerAnimated:YES];

bu onaylanmamış bir uyarı verir ... peki bunun alternatifi nedir?
Kirtikumar A.

Burada [blockSelf dismissViewControllerAnimated: YES complete: nil] kullandım;
Kirtikumar A.

0

Kullanmak yerine:

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

kullanabilirsiniz:

self.navigationController?.pushViewController(viewController: UIViewController, animated: Bool)

0

Benim durumumda, ben takdim edildi rootViewControllerbir bir UINavigationControllerben sunmak gerekiyordu zaman UINavigationControllerkendisini.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.