2009-09-09 5 views
12

L'iPhone Référence Libary - UIApplication dit que je peux sous-classe UIApplication, mais si je tente cela, je vais faire une exception:Comment sous-classer UIApplication?

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'There can only be one UIApplication instance.' 

Cela me rappelle le Highlander « Il ne peut y avoir qu'un seul ,. :-)

dois-je passer d'autres argurments à UIApplicationMain? Ou ai-je missread somthing dans le libary?

+0

http://stackoverflow.com/questions/26213279/objective-c-project-with-swift-uiapplication-subclass-error-class-not-loaded – Gangadhar

Répondre

24

Avez-vous transmis le nom de votre sous-classe à UIApplicationMain? Supposons que vous avez

@interface MyUIApp : UIApplication 
... 

puis en main() vous devriez faire:

NSString* appClass = @"MyUIApp"; 
NSString* delegateClass = nil; 
int retVal = UIApplicationMain(argc, argv, appClass, delegateClass); 
+0

Salut, j'ai essayé de la même manière que suggéré dans la réponse ... mais je reçois toujours la même erreur ... Tout ce que j'ai besoin de faire ...? –

+0

Comment puis-je récupérer cet objet de la classe "MyUIApp"? – Mangesh

+0

MyUIApp * app = [UIApplication sharedApplication]; –

10

dans Info.plist de votre application, assurez-vous de modifier la clé NSPrincipalClass au nom de votre sous-classe. Ça va faire Cocoa instancier la classe correcte lorsque les applications charge - vous devriez pas besoin de faire autre chose que ça pour que votre sous-classe fonctionne.

+0

Il n'y a pas de clé NSPrincipalClass dans mon info.plist. Devrais-je l'ajouter? – masche

+0

Oui - il y a beaucoup, beaucoup de clés qui pourraient être dans votre Info.plist - elles ne sont pas toutes incluses par défaut. – iKenndac

+3

Cela semble Mac OS X seulement, pas pour iPhone OS: http://developer.apple.com/iphone/library/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251 -SW1 – Eonil

-4

Il ne peut y avoir une instance de UIApplication dans une application, vous ne devriez pas initialiser l'un nouvel objet d'application, utilisez la méthode statique de l'UIApplication: + (UIApplication *) sharedApplication.

0

Je sais que c'est un ancien et réponse acceptée est ok, mais à préciser ...

Disons que vous avez:

UIApplication comme sous-classé MyApplication

UIApplicationDelegate comme sous-classé MyAppDelegate Puis votre main.m ressemblerait à:

Si vous n'avez pas sous-classé UIApplication ou UIApplicationDelegate, vous passez simplement nil au UIApplicationMain comme paramètre respectif.

Questions connexes