传递一个类作为参数?

JoB*_*324 39 iphone cocoa objective-c

我一直认为可以将类作为方法参数传递,但是我在实现这个概念时遇到了麻烦.现在我有类似的东西:

- (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;
}
Run Code Online (Sandbox Code Playgroud)

我称之为:

rootNavController = [ self navControllerFromView:RootViewController
    title:@"Contact"
    imageName:@"my_info.png"
];
Run Code Online (Sandbox Code Playgroud)

这张照片出了什么问题?

Pet*_*sey 46

- (id)navControllerFromView:(Class *)viewControllerClass
Run Code Online (Sandbox Code Playgroud)

它只是Class,没有星号.(Class不是类名;你没有传递指向Class类实例的指针,你自己传递一个类.)

rootNavController = [ self navControllerFromView:RootViewController
Run Code Online (Sandbox Code Playgroud)

你不能像这样传递一个裸名字 - 你必须给它发一条消息.如果您确实想要在某处传递该类,则需要向其发送class消息.从而:

rootNavController = [ self navControllerFromView:[RootViewController class]
        title:@"Contact"
        imageName:@"my_info.png"
];
Run Code Online (Sandbox Code Playgroud)

  • 正确.你需要一个类的名称.记住,编译时间和运行时间是分开的; viewControllerClass变量中的对象直到运行时才知道,因此您无法在编译时使用它来静态声明对象变量.你必须使用"id viewController". (3认同)

Ben*_*tow 12

看起来你差不多了.你想通过[RootViewController class]而不是RootViewController.这给了你一个Class价值.另外,我不认为你想要你的功能Class *,只需要一个Class.它实际上不是Objective-C对象.