7강 정리
학습 내용
MVCs 뭉치기
여러 개의 MVC를 사용하기 위해 특수하게 사용되는 View Controller가 있습니다.
이 View Controller는 View로 다른 MVC를 가질 수 있습니다.
UITabBarController
MVC와 하단의 탭바 아이템으로 구성이 되며, 탭바 아이템은 MVC들의 프로퍼티에 의해 icon, 이름 등이 결정 되게 됩니다.
UIPlitViewController
Master와 Detail로 구분되며 각각의 하나의 MVC입니다.
UINavigationController
새로운 MVC 화면을 열 때 마다, 카드가 하나씩 쌓이는 스택의 형태로 구성됩니다. 즉, 가장 처음에 보였던 화면은 가장 아래에 쌓이게 되고, 새롭게 나타나는 화면이 그 위에 올라가게 되는 것입니다. Back 버튼을 누르게 되면 새로운 화면은 힙에서 사라지게 됩니다.
Segue
각각의 MVC 화면들이 전환되게 하기 위해서 segue를 사용합니다.
segue의 종류에는
Show Segue(Navigation Controller를 Push 합니다.)
Show Detail Segue(Split View에서 Detail을 보여주기 위해 사용되며, Navigation Controller를 Push 하기도 합니다.)
Modal Segue(MVC 전체 화면을 덮는 화면을 보여줍니다.)
Popover Segue(화면에 작은 Popover로 나타나게 됩니다.)
잊지 말아야하는 것은 Segue는 항상 MVC의 새로운 인스턴스를 만든다는 것입니다.
(만약 조만간 뷰 컨트롤러를 다시 사용한다면, 최적화를 위해서 스택에서 제거된 뷰 컨트롤러를 강한 참조로 붙든 뒤, 다시 사용할 때 push를 이용해서 뷰 컨트롤러를 보여준다면 초기화 과정을 건너뛸 뿐만 아니라, 기존에 사용하던 데이터가 보존할 수 있습니다.)
세그웨이를 코드로 실행한다면 performSegue(withIdentifier: String, sender: Any?)를 통해 구현할 수 있습니다.
다만, 스토리보드에서 컨트롤러-컨트롤러 간의 세그웨이를 연결해주어야 사용이 가능합니다.
또한, shouldPerformSegue(withIdentifier: String, sender: Any?) -> Bool을 통해 세그웨이를 막을 수도 있습니다.
UINavigationViewController
기본적으로 segue를 이용하지만 특수한 경우에는 pushViewController(_ vc: UIViewController, animated: Bool), popViewController(animated: Bool) 함수를 통해 스택에서 삽입, 삭제가 가능합니다.
+ visibleViewController 변수를 사용하면 현재 화면에 표시되는 뷰 컨트롤러를 얻을 수 있습니다.
UISplitViewController
스플릿뷰 컨트롤러는 아이패드에서는 잘 작동하지만, 몇몇 아이폰에서는 작동하지 않습니다.
따라서 마스터에 UINavigationViewController를 사용한다면 아이폰에서 자동으로 적응하여, 스플릿뷰 컨트롤러를 무시하고 네비게이션 뷰 컨트롤러로 설정해줍니다.
UISplitViewController Delegate
위의 프로토콜을 채택하면 10가지 정도의 메소드를 위임받을 수 있다.
스플릿 뷰가 마스터 뷰를 뒤덮는지 등에 대한 메소드를 통해, 시작 시 디테일 뷰부터 시작되는 것을 방지할 수도 있다.
Timer
타이머는 run loop와 함께 작동하며, run loop내에 강한 참조를 유지하고 있습니다.
타이머를 생성하는 세가지 방법은 다음과 같습니다.
1. 타이머를 만들고, 기본 모드의 run loop에서 예약하려면 Timer.scheduledTimer(timeInterval:invocation:repeats:) 또는 Timer.scheduledTimer(timeInterval:target:selector:userInfo:repeats:) 클래스 메소드를 사용합니다.
2. run loop에서 예약하지 않고, 타이머 객체를 만드려면 init(timeInterval:invocation:repeats:) 또는 init(timeInterval:target:selector:userInfo:repeats:)를 이용하여 만든 뒤, 해당 run loop객체의 add(_:forMode:) 메소드를 호출하여 수동으로 run loop에 반드시 타이머를 추가해야합니다.
3. 타이머를 할당하고 init(fireAt:interval:target:selector:userInfo:repeats:)메소드를 사용하여 타이머를 초기화하세요. (역시나 생성 한 후, 해당 run loop객체의 add(_:forMode:)메소드를 호출하여 수동으로 run loop에 반드시 타이머를 추가해야합니다.)
또한 타이머에 tolerance 변수에 0이 아닌 값을 설정하면 어느정도의 오차 또한 납득한다는 의미이므로 전력 소모를 아낄 수 있다고 합니다.
* 앱이 백그라운드 상태에 들어간다면 타이머도 정지합니다.
Animation
애니메이션은 UIView와 Controller transition 이 두가지에 적용할 수 있습니다.
UIView에서 애니메이션 속성으로 변경할 수 있는 것들은 아래와 같습니다.