2010-07-25 13 views
5

Mam klasę kontrolera widoku (MyViewController), która zajmuje się podklasą UIView (MyView). Nie chcę pozwolić żadnej klasie z wyjątkiem klasy kontrolera widoku o podklasie UIView, więc nie mogę zaimportować MyView.h w MyViewController.h.Objective-C "prywatne" protokoły?

Więc w MyViewController.m, kładę

#import "MyViewController.h" 
#import "MyView.h" 

@interface MyViewController (PrivateObjects) 

MyView *myView; 

@end 

... 

Jednak, aby uzyskać informacje zwrotne od MyView używam delegata. Ten delegat musi wdrożyć protokół MyViewDelegate.

Jak mogę wdrożyć protokół wewnątrz MyViewControllerMyViewDelegate bez konieczności #importMyView.h w MyViewController.h?

Odpowiedz

14
@interface MyViewController (PrivateObjects) <MyViewDelegate> 
.... 

0

Tworzenie protokołu (.h) poza MyView.h i użyć jej w deklaracji ( .h) z MyViewController, na przykład:

#import "MyViewDelegate.h" 
@interface MyViewController : UIViewController <MyViewDelegate> 

--Frank

+0

Co jeśli delegat zawiera metodę '(BTW, nie można zadeklarować nową ivar w kategorii.) - (void) myView : (MyView *) myView textDidChange: (NSString *) text'? – ryyst

2

Można użyj deklaracji forware w MyViewController.h

@class MyView; 

@interface MyViewController { 
    MyView *myView; 
} 

@end 
-4

Dlaczego chcesz używać protokołu? Po prostu umieść metody w swojej kategorii PrivateObjects.

Edit: Jabłko odnosi się do tej techniki jako „informal protocol

+0

Ponieważ "po prostu umieszczenie tam metod" jest złym stylem programowania, plus 'MyView' powinien być wielokrotnego użytku, więc delegat jest zdecydowanie przydatny tutaj. – ryyst

+0

Aha, wygląda na to, że źle zrozumiałem "Nie chcę, aby jakakolwiek klasa poza klasą kontrolera widoku wiedziała o podklasie UIView" – user123444555621

1

znam moje brzmi to dziwnie, ale z doświadczenia mogę powiedzieć, aby nie przeszkadzało tak wiele o hierarchii prywatności w Cocoa.

W aplikacji lub w wewnętrznych strukturach wystarczy udokumentować klasę, opisującą sposób jej użycia.

To dlatego, że nie można mieć prawdziwej prywatności tak długo, jak długo C jest w pobliżu, więc Objective-C został zaprojektowany bez żadnej składni, która dawałaby tylko odrobinę złudzenia.

Na przykład zmienne wyjściowe kontrolerów widoku powinny być dostępne tylko dla samego kontrolera, ale zawsze są dostępne publicznie, ponieważ muszą być dostępne z klas, które anulują archiwizację i tworzą pliki końcówek i łączą gniazda z odpowiednie instancje.

[w tym sugestie bbum poniżej]

+0

Nie jest tak, że język jest niewystarczający w obsłudze prywatnych implementacji, jest bardzo język ma na celu * nie * marnowanie składni na tworzenie iluzji prywatności, a to wszystko, co i tak masz w języku opartym na C. – bbum