2009-06-23 13 views
37

Me han hecho creer que es posible pasar una clase como parámetro de método, pero tengo problemas para implementar el concepto. Ahora mismo tengo algo como:¿Pasa una clase como parámetro?

- (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; 
} 

y yo lo llamo así:

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

¿Qué hay de malo en esta imagen?

Respuesta

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

Es sólo Class, sin el asterisco. (Class no es un nombre de clase, usted no está pasando un puntero a una instancia de la clase Class, estás pasando una clase en sí.)

rootNavController = [ self navControllerFromView:RootViewController 

No se puede pasar de una un nombre de clase simple como este, tienes que enviarle un mensaje. Si realmente desea pasar la clase en algún lugar, debe enviar el mensaje class. Por lo tanto:

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

Ahora veo - todo lo que dice tiene sentido - y funciona si uso "Identificación viewController = [[viewControllerClass alloc] init] ; " - pero obtengo un error "viewController undeclaired" si intento "viewControllerClass * viewController = [[viewControllerClass alloc] init];" ¿Alguna idea de por qué? ¿O no puedo usar el parámetro de clase así? – JoBu1324

+3

Correcto. Necesitas el nombre de una clase allí. Recuerde, el tiempo de compilación y el tiempo de ejecución son cosas separadas; el objeto en la variable viewControllerClass no se conoce hasta el tiempo de ejecución, por lo que no puede usarlo para declarar estáticamente una variable de objeto en tiempo de compilación. Tienes que usar "id viewController". –

1

No ha explicado ningún problema con el código que ha publicado. ¿Qué no funciona? ¿Qué esperas que pase? Lo único que se me ocurre hasta ahora es que es posible que desee pasar [RootViewController class] en lugar de solo RootViewController. Además, tu formateo me está matando.

12

Parece que casi lo tienes. Desea pasar [RootViewController class] en lugar de RootViewController. Eso le da un valor de Class. Además, no creo que desee que su función tome un Class *, solo un Class. En realidad, no es un objeto Objective-C.

0

En Swift:

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

llamada con:

acceptingFunction(UIView) 
Cuestiones relacionadas