web-dev-qa-db-fra.com

Passer une classe en paramètre?

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

- (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 ça:

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

Quel est le problème avec cette image?

39
JoBu1324
- (id)navControllerFromView:(Class *)viewControllerClass

C'est juste Class, sans l'astérisque. (Class n'est pas un nom de classe; vous ne passez pas un pointeur sur une instance de la classe Class, vous transmettez une classe elle-même.)

rootNavController = [ self navControllerFromView:RootViewController

Vous ne pouvez pas transmettre un nom de classe nu comme ceci: vous devez lui envoyer un message. Si vous voulez réellement passer le cours quelque part, vous devez lui envoyer le message class. Ainsi:

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

On dirait que tu l'as presque. Vous voulez passer [RootViewController class] au lieu de RootViewController. Cela vous donne une valeur Class. De plus, je ne pense pas que vous souhaitiez que votre fonction prenne un Class *, mais simplement une Class Ce n'est pas réellement un objet Objective-C.

12
Ben Gotow

Vous n'avez expliqué aucun problème avec le code que vous avez posté. Qu'est-ce qui ne marche pas? Qu'espérez-vous qu'il se passe? La seule chose à laquelle je peux penser jusqu’à présent est que vous souhaitiez peut-être passer [RootViewController class] au lieu de RootViewController. En outre, votre mise en forme me tue.

1
Steven Canfield

En rapide:

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

appeler avec:

acceptingFunction(UIView)
0
Adam Johns