2009-06-23 13 views
37

Jestem przekonany, że możliwe jest przekazanie klasy jako parametru metody, ale mam problemy z jej implementacją. Teraz mam coś takiego:Przekaż klasę jako parametr?

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

i nazywam go tak:

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

Co jest nie tak z tym zdjęciem?

Odpowiedz

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

To tylko Class bez gwiazdką. (Class nie jest nazwa klasy; nie jesteś przechodzącą wskaźnik do instancji klasy Class, jesteś przechodzącą samą klasę.)

rootNavController = [ self navControllerFromView:RootViewController 

Nie można przekazać nazwa klasy tak wokół - musisz wysłać mu wiadomość. Jeśli chcesz gdzieś przenieść lekcję, musisz wysłać mu wiadomość o numerze class. Tak więc:

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

widzę teraz - wszystko, co mówi ma sens - i to działa, jeśli mogę użyć „id viewController = [[viewControllerClass alloc] startowych] ; " - ale dostaję błąd "viewController undeclaired" jeśli spróbuję "viewControllerClass * viewController = [[viewControllerClass alloc] init];" Każdy pomysł, dlaczego? Czy nie mogę użyć takiego parametru klasy? – JoBu1324

+3

Prawidłowo. Potrzebujesz imienia klasy. Pamiętaj, że czas kompilacji i czas pracy to oddzielne rzeczy; obiekt w zmiennej viewControllerClass jest nieznany do czasu wykonywania, więc nie można go użyć do statycznego zadeklarowania zmiennej obiektu w czasie kompilacji. Musisz użyć "id viewController". –

1

Nie wyjaśniłeś żadnego problemu z kodem, który opublikowałeś. Co nie działa? Czego się spodziewasz? Jedyne, o czym mogę pomyśleć, to to, że możesz podać [RootViewController class] zamiast tylko RootViewController. Poza tym formatowanie mnie zabija.

12

Wygląda na to, że prawie go masz. Chcesz przekazać [RootViewController class] zamiast RootViewController. To daje wartość Class. Ponadto, nie sądzę, że chcesz, aby Twoja funkcja zajmowała Class *, tylko Class. W rzeczywistości nie jest obiektem Objective-C.

0

w Swift:

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

połączenia z:

acceptingFunction(UIView) 
Powiązane problemy