2015-02-25 16 views
5

Czytanie kilku samouczków i książek na temat rozwoju iOS Często spotykam się z terminami: UIViewController cykl życia i UIView cykl życia. Interesuje mnie: czy istnieje faktyczna różnica między tymi dwoma terminami? Przeglądając dokumentację Apple stwierdziłem, że metody takie jak viewDidAppear lub loadView są częścią cyklu życia kontrolera widoku, ale uważam, że bardziej słusznie jest odnieść je do cyklu życia widoku i metod, takich jak initWithNibName lub dealloc jako cykl życia kontrolera. Albo nie ma takiego rozstania i kiedy ktoś mówi o cyklu widzenia, tak naprawdę oznacza on cykl życia UIViewController?Jaka jest różnica między cyklem życia kontrolera widoku a cyklem oglądania widoku w systemie iOS?

Odpowiedz

15

Wszystkie twój zamieszanie odejdzie raz w pełni uświadomić sobie różnicę między dwóch klas i zakorzeniony go w swoim umyśle (w praktyce)

UIViewController - klasa, która ma UI w sobie (nie całkowicie prawdziwe, ale ... zobacz widok root'a), jego celem jest kontrola widoków i wykonywanie pewnych powiązanych czynności .. To jest jak policjant lub kontroler ruchu kontrolujący innych. (widoki). większość czasu utworzyć własną podklasę UIViewController i że klasa wydaje się być dość ciężki na funkcjonalności jak

  • obsługi reguł logicznych, kiedy pokazać, co zobaczyć
  • podłączeniem do modelowania warstwa (dane i fakty o problem aplikacja jest rozwiązywanie)
  • interakcji z innymi sterownikami,

UIView - klasa, która reprezentuje obszar prostokąta, który może być mocno zmodyfikowany wizualnie, ale najważniejszym faktem jest to, że jest widoczny na ekranie i może mieć subviews, które są również UIViews. Widoki są zorganizowane w hierarchie widoków. Większość czasu dostosować widok tak, że jest

  • wizualnie przyjemny
  • uchwyty to subviews przez autoLayout
  • reprezentuje określony typ informacji wizualnej, czego potrzebujesz często podklasy do bardziej konkretnej klasy widok jak etykiety, teksty, przyciski, itp

jeden bit że myli przybyszów jest to, że każdy kontroler widok ma jeden widok główny, właściwość, która trzymaInstancja. Często można się zgubić, czy omawiany jest widok główny, czy omówiony jest kontroler widoku. W dyskusji przyczynowej między programistami te dwa słowa są czasem używane zamiennie.


Oba kontrolery & poglądy mają cykl życia, ale nie należy mylić dwóch.

ViewController cyklu jest to, co dzieje się z samego kontrolera, jak to budzi się z pliku nib, lub otrzymuje ostrzeżenie o pamięci, ale przede wszystkim o tym, jak jego widok korzeń budzi się do życia, jak się pojawia i znika umiera ..

Wyświetl cykl życia dotyczy tego, w jaki sposób widok przedstawia swoje subviews i jak renderuje swoją zawartość.


lubię analogii wizualnych .. Wystarczy wyobrazić sobie policjanta z dużą ilością kolorowych papierowych prostokątów. Policjant jest kontrolerem, a on mówi, co pokazuje (widoki) i kiedy na ekranie.

Sterownik i widok to abstrakcje będące częścią (kontrolera widoku modelu) Wzór architektoniczny MVC. Zalecam, abyś natychmiast to przestudiował, aby problem związany z zamieszaniem w całym cyklu życia został dodatkowo wyjaśniony.

14

Obie są różnymi koncepcjami, dlatego mają różne cykle życia.

UIViewController

ViewController jest regulator w MVC architecture. Dlatego jest odpowiedzialny za koordynację informacji pomiędzy modelem (twoje dane) i twoimi poglądami. UIViewControllers koordynować UIViews i są częścią nawigacji między ekranami (pushViewController, presentViewController). Dlatego musi wiedzieć, kiedy pojawi się na ekranie.

A UIViewController ma bardzo specyficzny cykl życia i ma metody, które można rozszerzyć, które są częścią tego cyklu życia. Przykładami takich metod są:

viewDidLoad, viewWillAppear, viewDidAppear, viewWillDisappear, viewDidDisappear

Zobacz

Widok z drugiej strony, nie należy się martwić, gdy ma się pojawić na ekranie . W związku z tym, że posiada pełną inny cykl życia:

awakeFromNib, willMoveToSuperView, didMoveToSuperView

This methods usually are called in the sequence of the UIViewController's life cycle. Dlatego zwykle, UIView reaguje na zmiany i ludzie nie uważają, że mają cykl życia na własną rękę.

Cykl życia ViewController ma sens tylko wtedy, gdy klasa rozszerza się o UIViewController, a cykl życia UIView ma sens tylko wtedy, gdy rozszerza się UIView.

W większości przypadków, gdy ludzie mówią o cyklu życia, będą rozmawiać o cyklu życia UIViewController, ponieważ Widok zwykle reaguje na zmiany. Dwa przykłady tych zmian to: widok zmienił swój rozmiar, zmienia rodzica.

+3

Ogólnie rzecz biorąc, twoja odpowiedź jest poprawna, ale nieco nieaktualna. Począwszy od iOS 6 UIViewController nigdy nie usuwa swojego widoku z pamięci w warunkach niskiej ilości pamięci. W szczególności metody viewWillUnload i viewDidUnload nigdy nie są wywoływane. [Dokumentacja] (https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/index.html#//apple_ref/occ/instm/UIViewController/viewDidUnload). – NAlexN

+0

Cykl życia obecnie wygląda tak, że widok jest ładowany za pierwszym razem, gdy 'UIViewController.view' jest wywoływany, dodawany i usuwany z hierarchii widoku dowolną liczbę razy i zwalniany podczas lub po" [UIViewController dealloc] ", gdy jest już poza hierarchią widoku. –

+0

Masz rację, ale nie mogłem znaleźć dobrego zaktualizowanego diagramu. Może powinienem go usunąć, ale uważam, że lepiej jest wizualizować przestarzały diagram niż nie rozumieć połączeń. Próbowałem znaleźć dobry diagram również dla UIView (połączenie z diagramem UIVIewController), ale nie mogłem go znaleźć :(Myślicie, że lepiej jest usunąć ten schemat? –

1

Dodając do tych odpowiedzi i skupiając się nieco więcej na dokładne pytania:

Jestem zainteresowany: czy istnieje rzeczywista różnica między tymi dwoma chodzi?

Tak, tam jest inny od obu, ale w sytuacji, gdy masz do czynienia z UIViewController's korzenia UIView, są w pewnym sensie powiązane.

Patrząc docs apple i okazało się, że metody, takie jak viewDidAppear lub loadview jest częścią cyklu widzenia regulatora, ale myślę, że to jest bardziej poprawne odnieść je jako widzenia cyklu życia i metod, takich jak initWithNibName lub dealloc jako regulatora koło życia.

I dlatego są one powiązane:

  • viewWillAppear
  • viewDidAppear
  • viewWillDisappear
  • viewDidDisappear:

Wszyscy są pod Odpowiadając wyświetlić zdarzenia w dokumentacji. Tak więc są to wywołania zwrotne od UIView do UIViewController informujące o jego stanie. I chociaż:

  • loadView
  • viewDidLoad

nie są pod tym samym odcinku (w dokumentacji), to ten UIView zainteresowanie/mówienie UIViewController o jej bieżącym stanie. I masz inne przykłady tych interakcji, na przykład:

  • viewWillLayoutSubviews
  • viewDidLayoutSubviews

W sposób (w kontekście swojej pytanie za) ogólną odpowiedź brzmi: tak, to są dwa różne cykle życia z różnymi szczegółami, ale są one w pewien sposób powiązane. Przykładem, w którym nie są bezpośrednio spokrewnione, byłby 's ' s . (Mówię wprost, ponieważ pośrednio może to być winowajca UIViewController root).