2

有没有办法得到以下结果:

    NSObject *a = [[NSObject alloc] init];
    [a class];

没有实例化?我希望将Class对象作为参数传递给函数,然后检查它。像这样:

    - (void) pushControllerOfClass: (Class) aClass
    {
        if([aClass isSubclassOfClass: *what should I write here?*]) {
        ...
        }
    }

直觉上,我试着写

        if([aClass isSubclassOfClass: UIViewController]) {

但它不起作用。感谢未来的回应。

更新: 这样的函数在 ObjectiveC 中被认为是坏的吗?我重构了 Nahavandipoor 的书iOS 5 Programming Cookbook中的代码。就像这样:

- (void) pushSecondController{
    SecondViewController *secondController = [[SecondViewController alloc]
                                             initWithNibName:nil 
                                             bundle:NULL];
    [self.navigationController pushViewController:secondController animated:YES];
}

对我来说,这是一种不好的功能:它没有在应该参数化的时候进行参数化。

4

4 回答 4

8

尝试:

 if([aClass isSubclassOfClass:[UIViewController class]])
于 2012-06-05T13:27:57.020 回答
3

在回答您的问题时,您不需要对象的实例来获取其类。您可以直接从类中获取它,例如:

[NSString class];
[YourClass class];

但是,如果您想要的只是一个可以推送您给它的任何视图控制器的方法,那么您可以使用 UIViewController 作为参数类型:

- (void)pushAnyViewController:(UIViewController *)viewController
{
    [self.navigationController pushViewController:viewController animated:YES];
}

这将获取作为 UIViewController 子类的任何视图控制器并将其推送到导航堆栈上。

如果您真的希望该方法也可以处理分配,您可以执行以下操作:

- (void)pushViewControllerClass:(Class)viewControllerClass
{
    if ([viewControllerClass isSubclassOfClass:[UIViewController class]])
    {
        id viewController = [[viewControllerClass alloc] initWithNibName:nil bundle:nil];
        [self.navigationController pushViewController:viewController animated:YES];
    }
}

并这样称呼它:

Class viewControllerClass = [MyViewController class];
[self pushViewControllerClass:viewControllerClass];

如果您使用的是笔尖,请确保笔尖的名称与类相同。

于 2012-06-05T16:23:45.983 回答
2

您可以编写[UIViewController class]以获取类对象。

于 2012-06-05T13:29:10.687 回答
0

大多数类上应该有一个类方法来获取该类。

如果您发现自己经常这样做,也许重新审视您的设计?

于 2012-06-05T13:29:45.443 回答