티스토리 뷰
안녕하세요! 오늘은 View Controller생명 주기에 대해 알아보겠습니다.
iOS를 시작하려고 하거나, 배우고 있는 분들이라면 반드시 알아야 해요.
하나하나 제대로 알아봅시다 ㅎㅎ
View Controller의 생명주기(Life-Cycle)
그러면 우리가 지금 뭘 배울지 알아야겠죠?
그냥 View Controller의 생명주기를 알아와!!해서 복붙만 하면 공부가 안됩니다.
제대로 공부해야해요.
그럼 이것부터 생각 해볼까요?
View Contorller의 생명주기?
이게 뭘까요?
앱들은 이 'View Contorller'로 이루어져있는데요,
화면이 하나로 되어있는 앱 들도 물론 있겠지만,
보통 하나 이상의 화면이 있죠?
이 각각의 뷰컨들은 생명주기를 가지고 있답니다.
생명주기라고 하니
언제 태어나고 언제 죽는 이런 주기같네요?
뷰컨에게서는 생명주기가 어떤걸까요?
말그대로 '보여졌다 사라지는'주기겠죠?
'보여졌다'->'사라졌다'
대충 이런 주기를 가지겠네요
결론만 말씀드리면, 뷰는
이러한 주기를 가지게됩니다.
loadView는 나중에보고 viewDidLoad부터 볼게요.
(왜 나중에 보는지 밑에서 설명하겠습니다.)
자, 위 그림에서는
viewDidLoad
↓
viewWillAppear
↓
viewDidAppear
↓
viewWillDisappear
↓
viewDidDisappear
뷰컨이 이러한 생명주기를 가진다고 하네요?
아무런 설명없이 그냥 함수들 이름을 볼게요.
먼저 보이는건 Will과 Did네요.
다들 뭔지는 아실거라고 생각합니다.
Will은 미래를 나타내고 Did는 과거를 나타내죠?
하나씩 볼까요?
viewDidLoad
Did네요?
"뷰가 로드 되었다"
라는 뜻같네요.
viewWillAppear
이번엔 Will입니다. 게다가 Appear(나타나다)네요?
"뷰가 나타날 것이다"
라는 뜻같네요.
viewDidAppear
Did입니다.
"뷰가 나타났다"
viewWillDisappear
Will이네요. 이번엔 Disappear(사라지다)네요.
"뷰가 사라질 것이다"
viewDidDisappear
Did입니다.
"뷰가 사라졌다"
어때요?
솔직히 저게 다에요.
함수의 이름만 봐도 이 함수가 언제 호출 될지 알 수 있지 않으신가요?
(이래서 네이밍이 중요합니다....)
그래도 하나하나 알아봐야겠죠?
위에서 잠깐 훑어봤으니 그리 어렵지 않을거에요 :)
먼저, viewDidLoad부터 봅시다.
1. viewDidLoad
자,viewDidLoad?
뭔가 익숙하지 않으신가요?
맞습니다.
바로
프로젝트를 새로 만들면 보이는
viewDidLoad()함수입니다.
이 viewDidLoad()가 왜 있는 걸까요? 하는 기능은 뭘까요?
apple문서를 보시면,
"Called after the controller's view is loaded into memory"
: 뷰의 컨트롤러가 메모리에 로드되고 난 후에 호출됩니다.
라고 하네요.
일단 '뷰'라는 것을 만들고, 메모리에 올려야 접근이 가능하겠죠?
이 viewDidLoad의 기능을 설명드리면,
: 이 viewDidLoad 메소드는 뷰의 로딩이 완료 되었을 때
시스템에 의해 자동으로 호출되기 때문에
일반적으로 리소스를 초기화하거나
초기 화면을 구성하는 용도로 주로 사용합니다.
화면이 처음 만들어질 때 한 번만 실행되므로,
처음 한 번만 실행해야 하는 초기화 코드가 있을 경우
이 메소드 내부에 작성하면 됩니다.
2. viewWillAppear
자, 이제 뷰가 로드 된 다음의 상황을 볼까요?
이제 뷰가 나타나서 제 눈에 보여야겠죠?
이 viewWillAppear는 뷰가 이제 나타날 거라는 신호를
컨트롤러에게 알리는 역할을 합니다.
즉 뷰가 나타나기 직전에 호출된다고 볼 수 있어요.
그럼 이러한 궁금증이 드실 수 있어요.
"viewDidLoad도 뷰가 나타나기 전에호출되는데..
viewDidLoad랑 똑같은거 아니야?"
..아닙니다.
그럼 뭐가 다를까요? 예제를 통해 볼게요.
자, 뷰가 2개가 있다고 생각해 볼게요.
뷰 생명주기는 각각의 뷰에 다 적용되는 거는 아시죠?
(지금 첫번째 뷰, 두번째 뷰 컨트롤러에 viewDidLoad와 viewWillAppear함수를 정의해놓은 상태입니다.)
딱 이앱을 실행 시키면,
왼쪽 뷰가 뜨고
콘솔창에는 호출되면 프린트하도록 프린트문을 작성해놨어요.
우리가 위에 배운대로
viewDidLoad가 호출되고
뷰가 나타날 준비를 했을거니 viewWillAppear함수도 호출됐겠죠?
(지금 상태는 viewDidAppear까지 수행된 상태긴 한데, 지금은 viewDidLoad와 viewWillAppear의 차이를 보여드리기 위해서..)
자, 이제 버튼을 눌러서 다음화면으로 가봅시다.
두번째 뷰 역시
viewDidLoad가 호출된 후 viewWillAppear함수가 호출된 것을 볼 수 있습니다.
하지만!!여기서 다시 첫번째 뷰로 가게 되면 어떻게 될까요?
(네비게이션 컨트롤러입니다.)
viewDidLoad가 호출이 안됐죠?
차이가 이해가시나요?
(이유는 이 글에서 찾으실 수 있습니다.)
앱의 초기화 작업은 viewDidLoad에서 해도 되겠지만,
다른뷰에서 갔다가 다시 돌아오는 상황에
해주고 싶은 처리가 있겠죠?
이때는 viewWillAppear에서 해주면 된답니다.
ㅎㅎㅎ
3. viewDidAppear
자, viewDidAppear까지 왔네요!!
viewDidAppear는 뷰가 나타났다는 것을 컨트롤러에게 알리는 역할을 합니다. 또한 화면에 적용될 애니메이션을 그려줘요.
이 viewDidAppear는 뷰가 화면에 나타난 직후에 실행됩니다.
이 것을 제외하고 viewDidAppear와 viewWillAppear는 거의 같아요.
4. viewWillDisappear
자, viewWillDisAppear는
뷰가 사라지기 직전에 호출되는 함수인데요,
뷰가 삭제 되려고하고있는 것을 뷰 콘트롤러에 통지합니다.
5. viewDidDisappear
마지막인 viewDidDisAppear까지 왔네요!
(생명주기는 순환되기 때문에 마지막?은 아닐 수도 있겠지만..)
역시 위와 같아요
viewDidDisAppear가 호출되면,
뷰 컨트롤러가 뷰가 제거되었음을 알려준답니다.
.
.
.
자 이제, 저 5개의 생명주기들을 코드로 확인해볼게요.
아까 그 예제를 가지고 해보겠습니다.
저 다음화면으로 가려면 클릭을 누르면
첫번째 뷰는 사라지고 두번째 뷰가
짠 하고 제 눈앞에 나타나게 되겠죠?
즉, 첫번째 뷰는 disappear메소드를 실행하게 되고
두번째뷰는 viewdDidLoad부터 appear메소드를 실행하게 됩니다.
확인해볼까요?
자, 여기서 눈여겨 봐야할 부분은!! 저 2번째 블록입니다.
첫번째 뷰가 이제 사라질 것이라는 WillDisappear가 호출된 다음에는
DidAppear가 호출될 것 같잖아요?
그런데
두번째 뷰가 로드되고 WillAppear가 호출된 다음에!!!!!!
첫번째뷰가 진정으로 사라지게 되는
1st viewDidDisappear가 호출됩니다.
그리고 나서!!
두번째 뷰가 진정으로 나타났다는
viewDidAppear가 호출됩니다.
그러니 다들 뷰가 2개 이상 있을 때는
ViewWillAppear다음에는 바로 ViewDidAppear가 호출돼!!!
라고 섣불리 말하면 안되겠죠?
이제 다시 첫번째뷰로 가볼까요?
세번째 블록을 잘 봐주세요.
첫번째뷰로 왔으니 두번째뷰가 이제 사라질 것이라는 WillDisappear가 호출되고
viewDidLoad는!!!!!!호출되지않고!!!!!!!!!!
바로 첫번째뷰의 willAppear가 호출됩니다.
왜냐하면 첫번째 뷰의 viewDidLoad는 현재 네비게이션 컨트롤러의 rootView이어서 한번만 호출되기 때문이죠.
자.. 이렇게 마무리 지으려고 했는데
위에서 loadView에대해서 설명드린댔죠?
처음에 loadView가 호출되는 시점을 보여드릴려고
이렇게 했었는데.. 실행해보니
이렇게 검정 화면만 뜨는 거에요!!!!!
그래서 뭐지..?하고 찾아봤는데
apple문서를 보시면,
You should never call this method directly.
ㄷㄷ...
애플이 말하길,
"이 메서드를 직접 호출하면 안됩니다."
라고 하네요.
그리고 엄청 어려운 말들이 줄줄 나오는데
마지막에
If you want to perform any additional initialization of your views, do so in the viewDidLoad() method.
: 뷰의 추가 초기화를 수행하려면 viewDidLoad () 메소드에서 수행하십시오.
라고 하네요!
그럼 loadView의 역할은 뭘까요?
바로 컨트롤러가 관리하는 뷰를 '만드는' 역할을 합니다.
그럼 loadView가 뷰를 만들고, 메모리에 올린 후에!
viewDidLoad가 호출된다고 할 수 있겠네요.
+) 댓글에 어떤분이 알려주셨어요 :)
제가 super.loadView()를 호출하지 않아서 검정화면이 나왔던 거였어요..
그렇다고 합니다..!!
자.. 오늘은 뷰의 생명주기에 대해서 알아봤는데.. 이제 좀 아시겠나요?
도움이 되었으면 좋겠어요!!
꼭 알아야하는 것들이랍니다 :)
'iOS' 카테고리의 다른 글
iOS10 ) STT(Speech-To-Text) 구현 (20) | 2017.03.17 |
---|---|
iOS ) View의 생명주기2(Life-Cycle) / navigation controller (9) | 2017.03.14 |
iOS10 ) TTS(Text-To-Speech) 구현 (2) | 2017.03.10 |
iOS ) masksToBounds/clipsToBounds의 차이점 (4) | 2017.03.02 |
iOS ) 텍스트뷰 테두리 둥글게/버튼 둥글게 (3) | 2017.03.02 |
- FLUTTER
- SwiftUI
- Xcode
- swift3
- WidgetKit
- 제이슨 파싱
- swift array
- WWDC
- 피아노
- IOS
- 스위프트 문법
- 스위프트
- fastlane
- Swift
- Git
- swift tutorial
- Combine
- swift sort
- actor
- swift delegate
- np-hard
- ios 13
- swift 공부
- UIBezierPath
- iOS delegate
- github
- 회고
- WKWebView
- Accessibility
- np-complete
- Total
- Today
- Yesterday