2009-01-08 5 views
2

J'écris actuellement une application iPhone qui utilise un UITabBarController avec plus de 5 éléments de barre d'onglets. Ainsi, un onglet "plus" est généré automatiquement (comme dans l'application YouTube). J'ai découvert que la classe de contrôleur de vue correspondante est UIMoreListController, mais je n'ai aucun fichier .h correspondant. Donc, mon code ressemble à ceci:Comment désactiver l'avertissement de compilateur de classe avant (classe non documentée)

@class UIMoreListController; // can't use #import since .h file is missing 

@implementation SomeUINavigationControllerDelegate 

- (void)navigationController:(UINavigationController *)navigationController 
     willShowViewController:(UIViewController *)viewController 
     animated:(BOOL)animated 
{ 
    if ([viewController isKindOfClass:[UIMoreListController class]]) 
     ... // do something if "more" view is active 

Cela fonctionne comme un charme. Cependant, le compilateur continue à me donner

avertissement: récepteur « UIMoreListController » est une classe avant et @interface correspondant peut ne pas exister

Y at-il une belle façon de se débarrasser de cet avertissement (et cela avertissement particulier seulement)? Encore une fois, je ne peux pas utiliser #import car aucun fichier .h n'est disponible.

Répondre

10

Si vous essayez juste de vérifier la classe UIMoreListController, vous pouvez accéder à la variable de classe en utilisant l'API-Obj.

if ([viewController isKindOfClass:NSClassFromString(@"UIMoreListController")]) 

vous n'avez pas besoin de la #import ou la déclaration @class.

0

Vous ne devriez pas avoir à déclarer ou #importer l'une des classes Cocoa Touch standard. UIMoreListController ne semble pas être une classe publique que vous devriez utiliser en ce moment, si elle l'était, elle serait listée dans la documentation. La page que vous avez liée à est un vidage de SDK, tout n'est pas sûr à utiliser si vous envisagez de libérer votre application dans l'App Store. Cela étant dit, vous pouvez le déclarer comme identifiant de type et, si nécessaire, déclarer une catégorie sur NSObject avec l'une des méthodes spécifiques à UIMoreListController que vous devez appeler.

0

déclarez-le comme ID de type et, si nécessaire, déclarez une catégorie sur NSObject avec l'une des méthodes spécifiques UIMoreListController que vous devez appeler.

Cela ne fera pas l'affaire. Tout ce dont j'ai besoin est

if ([viewController isKindOfClass:[UIMoreListController class]]) 

De toute façon, vous avez raison de libérer des hacks sales via l'App Store. Malheureusement, the Reference is somewhat secretive about those moreNavigationControllers. Ils vous disent que c'est juste un UINavigationController (qui, en effet, c'est). Peut-être que je devrais essayer une approche différente pour savoir si viewController est un UIMoreListController. Quelque chose comme

if ([viewController isEqual:[navigationController topViewController]]) 

devrait fonctionner, puisque le UIMoreListController est toujours le topViewController. (Je peux me tromper, mais je vais essayer)

0

Pourquoi essayez-vous de faire cela? Vous ne devriez pas utiliser d'API privée. Il n'y a aucune garantie que cette classe sera toujours présente dans la prochaine version du système d'exploitation, et si vous le supposez, cette route mène à des bogues ou même à des plantages.

+0

Vous avez absolument raison. J'ai décidé d'utiliser une approche différente après tout: http://pastebin.com/f28191612 Cela suffit pour détecter le UIMoreListController, j'espère. – user123444555621

0

Tant que vous êtes dans le délégué de moreNavigationController, cela devrait faire l'affaire:

[viewController isEqual:[navigationController.viewControllers objectAtIndex:0]] 

Par comparaison, topViewController vous donnera le contraire de ce que vous voulez. En utilisant objectAtIndex:0 devrait aider à éviter toutes les manigances privées.

Questions connexes