2009-06-23 14 views
37

J'ai été amené à croire qu'il est possible de passer une classe comme paramètre de méthode, mais j'ai du mal à implémenter le concept. En ce moment j'ai quelque chose comme:Passer une classe en paramètre?

- (id)navControllerFromView:(Class *)viewControllerClass 
          title:(NSString *)title 
         imageName:(NSString *)imageName 
{ 
    viewControllerClass *viewController = [[viewControllerClass alloc] init]; 
    UINavigationController *thisNavController = 
    [[UINavigationController alloc] initWithRootViewController: viewController]; 

    thisNavController.tabBarItem = [[UITabBarItem alloc] 
            initWithTitle: title 
              image: [UIImage imageNamed: imageName] 
              tag: 3]; 
    return thisNavController; 
} 

et je l'appelle comme ceci:

rootNavController = [ self navControllerFromView:RootViewController 
    title:@"Contact" 
    imageName:@"my_info.png" 
]; 

Quel est le problème avec cette image?

Répondre

44
- (id)navControllerFromView:(Class *)viewControllerClass 

Il est juste Class, sans l'astérisque. (Class est pas un nom de classe, vous n'êtes pas passer un pointeur vers une instance de la classe Class, vous passez une classe elle-même.)

rootNavController = [ self navControllerFromView:RootViewController 

Vous ne pouvez pas passer une nom de la classe nue autour comme ça-vous devez lui envoyer un message. Si vous voulez réellement passer la classe quelque part, vous devez lui envoyer le message class. Ainsi:

rootNavController = [ self navControllerFromView:[RootViewController class] 
     title:@"Contact" 
     imageName:@"my_info.png" 
]; 
+1

Je vois maintenant - tout ce que vous avez dit est logique - et cela fonctionne si je l'utilise « id viewController = [[viewControllerClass alloc] init] " - mais j'obtiens une erreur "viewController undeclaired" si j'essaie "viewControllerClass * viewController = [[viewControllerClass alloc] init];" Une idée pourquoi? Ou est-ce que je ne peux pas utiliser le paramètre de classe comme ça? – JoBu1324

+3

Correct. Vous avez besoin du nom d'une classe là-bas. Rappelez-vous, compiler le temps et le temps d'exécution sont des choses séparées; L'objet de la variable viewControllerClass n'est pas connu avant l'exécution, vous ne pouvez donc pas l'utiliser pour déclarer de façon statique une variable d'objet lors de la compilation. Vous devez utiliser "id viewController". –

1

Vous n'avez pas expliqué le moindre problème avec le code que vous avez posté. Qu'est-ce qui ne fonctionne pas? Qu'attendez-vous qu'il se passe? La seule chose que je peux penser à ce jour est que vous pourriez vouloir passer [RootViewController class] au lieu de seulement RootViewController. En outre, votre mise en forme me tue.

12

On dirait que vous l'avez presque. Vous voulez passer [RootViewController class] au lieu de RootViewController. Cela vous donne une valeur Class. En outre, je ne pense pas que vous voulez que votre fonction prenne un Class *, juste un Class. Ce n'est pas réellement un objet Objective-C.

0

Swift:

func acceptingFunction(aClass: AnyClass) { 
    ... 
} 

appel avec:

acceptingFunction(UIView) 
Questions connexes