Передать класс в качестве параметра? - PullRequest
39 голосов
/ 23 июня 2009

Меня убеждают, что в качестве параметра метода можно передать класс, но у меня возникли проблемы с реализацией концепции. Прямо сейчас у меня есть что-то вроде:

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

и я называю это так:

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

Что не так с этой картинкой?

Ответы [ 4 ]

46 голосов
/ 23 июня 2009
- (id)navControllerFromView:(Class *)viewControllerClass

Это просто Class, без звездочки. (Class не является именем класса; вы не передаете указатель на экземпляр класса Class, вы передаете сам класс.)

rootNavController = [ self navControllerFromView:RootViewController

Вы не можете разглашать голое имя класса вот так - вы должны отправить ему сообщение. Если вы действительно хотите где-то передать класс, вам нужно отправить ему сообщение class. Таким образом:

rootNavController = [ self navControllerFromView:[RootViewController class]
        title:@"Contact"
        imageName:@"my_info.png"
];
12 голосов
/ 23 июня 2009

Похоже, ты почти понял. Вы хотите передать [RootViewController class] вместо RootViewController. Это дает вам значение Class. Кроме того, я не думаю, что вы хотите, чтобы ваша функция принимала Class *, просто Class. На самом деле это не объект Objective-C.

1 голос
/ 23 июня 2009

Вы не объяснили никаких проблем с кодом, который вы разместили. Что не работает? Чего вы ожидаете? Пока я могу думать только о том, что вы можете передать [RootViewController class] вместо RootViewController. Кроме того, ваше форматирование убивает меня.

0 голосов
/ 02 июня 2015

В Свифт:

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

позвонить по номеру:

acceptingFunction(UIView)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...