2009-06-23 222 views
37

我一直認爲可以傳遞一個類作爲方法參數,但是我在實現這個概念時遇到了問題。現在,我有這樣的:傳遞一個類作爲參數?

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

有什麼不對的圖片?

回答

44
- (id)navControllerFromView:(Class *)viewControllerClass 

這只是Class,沒有星號。 (Class不是一個類名,你不是一個指針傳遞到Class類的實例,你傳遞一個類本身。)

rootNavController = [ self navControllerFromView:RootViewController 

你不能傳遞類似這樣的裸類名 - 你必須發送一條消息。如果你真的想在某個地方通過課程,你需要發送class消息。因此:

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

我看現在 - 你所說的一切是有道理的 - 和它的作品,如果我使用「標識的viewController = [[viewControllerClass的alloc]初始化] ;」 - 但我得到一個「viewController undeclaired」錯誤,如果我嘗試「viewControllerClass * viewController = [[viewControllerClass alloc] init];」任何想法爲什麼?或者我可以不使用類參數嗎? – JoBu1324 2009-06-23 05:02:16

1

你沒有解釋你發佈的代碼的任何問題。什麼不行?你期望發生什麼?我目前唯一能想到的是,您可能想要通過[RootViewController class]而不是僅僅通過RootViewController。此外,你的格式正在殺死我。

12

看起來你已經差不多了。您想通過[RootViewController class]而不是RootViewController。這給你一個Class值。此外,我不認爲你想要你的功能採取Class *,只是Class。它實際上不是一個Objective-C對象。

0

在斯威夫特:

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

通話用:

acceptingFunction(UIView)