2011-09-15 11 views
75

Mi sono appena imbattuto in un incidente che mostrava un NSInvalidArgumentException con questo messaggio su un'app che non lo stava facendo prima."L'applicazione ha tentato di presentare modally un controller attivo"?

Applicazione cercato di presentare un modale attivo controllore UITabBarController: 0x83d7f00.

Ho un UITabBarController che creo nel AppDelegate e dare la matrice di UIViewControllers.

Uno di questi che desidero presentare modalmente quando viene toccato su di esso. L'ho fatto per l'attuazione del metodo delegato

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

Se questo controller di vista è della classe di quello che voglio presentare modale, torno NO e faccio

[tabBarController presentModalViewController:viewController animated:YES]; 

E ora mi sto quell'errore, che sembra significare che non è possibile presentare modalmente un controller di visualizzazione che è attivo da qualche altra parte (nella tabbar ...) Dovrei dire che sono su XCode 4.2 Developer Preview 7, quindi questo è iOS 5 (Conosco la NDA, ma penso di non fornire dettagli proibiti). Al momento non ho un'installazione XCode per verificare se questo si blocca durante la compilazione con l'SDK iOS4, ma sono quasi sicuro che non lo sia.

Ho solo voluto chiedere se qualcuno ha sperimentato questo problema o ha qualche suggerimento

+0

Prima di iOS 5, questo non ha sollevato un'eccezione, ma non ha restituito nulla. Da iOS 5 in poi, questo comando solleva un'eccezione. –

risposta

76

suppone che si abbia tre controller di vista istanziati in questo modo:

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

li hai aggiunto a una barra delle schede come questo :

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

Ora si sta cercando di fare qualcosa di simile:

[tabBarController presentModalViewController:vc3]; 

Questo ti darà un errore, perché il controller della barra delle linguette ha una presa mortale sul controller della vista che tu hai dato. Non è possibile aggiungerlo alla serie di controller di visualizzazione nella barra delle schede o non è possibile presentarlo in modo modale.

Apple si aspetta che tu tratti i loro elementi dell'interfaccia utente in un certo modo. Questo è probabilmente sepolto nelle Linee guida dell'interfaccia umana da qualche parte come "non farlo perché non ci aspettiamo che tu voglia mai farlo".

+6

La cosa è che non era assolutamente un problema prima di iOS 5, quindi la mia preoccupazione! Quello che ho fatto è stato aggiungere un dummy UIViewController alla tabbar e presentare in modo modale l'istanza di sottoclasse del controller di visualizzazione. –

+0

@Iswank Grazie. Mi hai salvato il tempo! – CReaTuS

+1

@Iswank, ora in iOS 6, per rendere le cose "più semplici", hanno deprecato presentModalViewController causando tutti i tipi di problemi di rotazione ... è necessario utilizzare presentViewController: animato: completamento e verificare come la tua app sta gestendo le modifiche – whyoz

0

sufficiente rimuovere

[tabBarController presentModalViewController:viewController animated:YES]; 

e mantenere

[self dismissModalViewControllerAnimated:YES]; 
+0

questo dà deprecato avvertimento ... quindi qual è l'alternativ di questo? –

+0

Qui ho usato [blockSelf dismissViewControllerAnimated: YES completion: nil]; –

11

Ho lo stesso problema. Provo a presentare il controller della vista subito dopo aver chiuso.

Quando provo a farlo senza animazione funziona perfettamente così il problema è che il controller è ancora vivo. Penso che la soluzione migliore sia usare dismissViewControllerAnimated:completion: per iOS5

+0

Fallisce se lo si disattiva animato perché nel momento in cui si desidera presentare nuovamente il controller della vista modale, è ancora modalmente sullo schermo, essendo animato via. – Pascal

+2

È deprivato in IOS 6.0 –

2

Ho avuto lo stesso problema. Lo risolvo.Potete provare questo codice:

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