2008-11-11 11 views
6

Próbuję zawinąć głowę wokół ról UIViews i UIViewControllers. Jeśli programuję programowo i wstawiając subviews, czy typowo jest to robić z widoku lub kontrolera?UIViewController vs. UIView - który z nich powinien tworzyć subviews?

Naprawdę zastanawiam się, czy istnieje konwencja/wzorzec dla tego. W mojej przykładowej aplikacji ładuję 50 obrazów w środowisku wykonawczym, dodając je jako subviews do głównego widoku, a następnie pozwalając użytkownikowi przeciągnąć je po ekranie. Jestem obecnie robi wszystko inicjalizacji w initWithCoder widoku za:

- (id)initWithCoder:(NSCoder*)coder 
{ 
    if (self = [super initWithCoder:coder]) { 
     // load UIImageViews and add them to the subview 
    } 

    return self; 
} 

Widok realizuje również touchesBegan/touchesMoved aby umożliwić przeciągnięcie. Mój problem pojawia się, gdy próbuję uzyskać dostęp do [self frame] .size w initWithCoder, wydaje się, że nie został jeszcze zainicjowany. To sprawia, że ​​myślę, że ładuję obrazy w niewłaściwym miejscu ...

+0

To zależy od tego, co robisz z nimi ... zwykle używasz kontrolera widoku, gdy chcesz wyświetlić widok pełnoekranowy z autorotacją, itp. Lub gdy chcesz wstawić widok pełnoekranowy do czegoś podobnego kontroler kart. Czy możesz nieco rozszerzyć swoje pytanie? –

Odpowiedz

7

To zależy od tego, co robisz. Jeśli widok reprezentuje coś "zapakowanego", to tworzysz subviews z samego widoku. Jeśli po prostu agregujesz widoki razem, powinieneś zrobić to za pomocą kontrolera widoku.

Pomyśl o tradycyjnej enkapsulacji. Czy twój wydział koncepcyjnie "jest częścią" swojego superumiełu, czy po prostu żyje tam w hierarchii rysunku?

+0

Zaktualizowałem pytanie, aby uzyskać więcej informacji. W moim przypadku widok jest tylko częścią hierarchii, ale implementuje również touchBegan/touchesMoved, aby umożliwić przeciąganie. –

+0

Po pewnym odczycie wygląda na to, że kontroler może faktycznie zareagować na te zdarzenia, w którym to przypadku mogę zrobić wszystko ze sterownika. –

2

Załóżmy, że tworzysz widok zawierający pewne elementy sterujące, np. Edytujesz rekord z wieloma polami lub czymś podobnym. Ponieważ zamierzasz używać tych pól tekstowych i ich danych w kontrolerze widoku, koncepcyjnie "należą one" do kontrolera widoku, a widok nadrzędny istnieje tylko w celu grupowania i układu. Jest to prawdopodobnie bardziej powszechny scenariusz.

Jeśli tworzysz podklasę widoku, aby zachowywać się jak nowa kontrolka, na przykład, to powinieneś utworzyć widoki i zarządzać widokami całkowicie w klasie widoku. Wyobrażam sobie, że przypadek ten zdarza się rzadziej w praktyce.

2

Wygląda na to, że możesz dodać je w niewłaściwym miejscu. Jeśli przeniesiesz dodawanie subskrybentów do ViewController, możesz wykonać tę pracę na viewDidLoad i masz gwarancję, że główny widok został już zainicjowany i gotowy do dostępu.

1

Dummy wyjaśnienie byłoby tak:

podklasa UIViewController gdy planujesz, aby wyświetlić widok jako modalnego (presentModalViewController) lub wewnątrz UINavigationController (pushViewController)

podklasa UIView ilekroć jest to mały element wewnątrz widoku głównym ... na przykład chcesz zrobić przycisk niestandardowy lub ...

Dokładniej w twoim przykładzie ... jeśli uruchamiasz UIViewControllery, możesz ustawić właściwości widoku np. jak rozmiar klatki tylko po dodaniu widoku do podglądu. Tylko w tym momencie UIViewController ładuje i inicjalizuje swój widok.

Myślę, że w twoim przypadku powinieneś użyć UIViews ... możesz ustawić rozmiar klatki zaraz po przydzieleniu & ich inicjalizacji.

Powiązane problemy