2012-03-31 10 views
5

Mam ten kod w metodzie prepareForSegueObjective-C Wywołanie selektor, że kompilator nie wierzy istnieje (choć wiemy, że to robi)

// Get destination view 
    UIViewController *viewController = [segue destinationViewController]; 

    //See if it responds to a selector 
    if ([viewController respondsToSelector:@selector(setSomethingOrOther:)]) { 
     //if so call it with some data 
     [viewController setSomethingOrOther:something]; 
    } 

Powyższy kod oznacza, że ​​nie trzeba obejmują odniesienie do rzeczywistej klasy kontrolowanego kontrolera widoku. Mogę luźniej powiązać dwa kontrolery widoku i po prostu sprawdzić, czy odpowiada na niektóre właściwości, które są na nim ustawione.

Problem polega na tym, że kiedy to pojawia się następujący błąd czasu kompilacji zrobić:

Brak widocznych @interface dla „UIViewController” deklaruje selektor „setSomethingOrOther:”

co jest prawdą oczywiście . Wiem, że mógłbym obejść to, dołączając odniesienie do widoku, ale wolałbym go oddzielić. W jaki sposób można obejść ten

Odpowiedz

10

użyć metody performSelector:aSelector, to można nazwać selektor nierejestrowanej.

+0

Dziękuję, czuję się jak idiota. Użyłem tego trochę w innych scenariuszach. –

7
[viewController performSelector:@selector(setSomethingOrOther:) 
        withObject:something]; 
+0

Przyjemna, czysta, próbka kodu +1 –

3

Można również zrobić to

[(id)viewController setSomethingOrOther:something]; 

w niektórych sytuacjach, ale kompilator będzie narzekać, jeśli nie wie o istnieniu setSomethingOrOther: w ogóle, jak biblioteki, które nie zostały objęte nagłówek dla.

+0

To jest właściwie punkt tego pytania; Nie chcę w ogóle uwzględniać nagłówka. Chcę więcej separacji między moim ViewControllers. –

+0

Nie przeczytałeś poprawnie odpowiedzi, to zadziała, jeśli metoda jest zdefiniowana gdzieś w projekcie, po prostu nie chcesz włączyć nagłówka. –

+0

o dość fair .. –

Powiązane problemy