Подтвердить что ты не робот

Передавать класс как параметр?

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

- (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"
];

Что не так с этим изображением?

4b9b3361

Ответ 1

- (id)navControllerFromView:(Class *)viewControllerClass

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

rootNavController = [ self navControllerFromView:RootViewController

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

В Swift:

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

вызов с помощью:

acceptingFunction(UIView)