Navigation은 앱에 Depth가 존재하는 한 필수적인 요소입니다!
Storyboard로 쉽게 구현할 수 있지만 저는 코드로 만드는 것을 좋아해서 코드로 만들어 보겠습니다 :)
# UINavigationController를 코드로 구현해보자
위와 같이 간단한 Navigation을 만들어 보겠습니다!
원리만 알면 다른 요소들은 추가하면 되니까 간단하게 구현해보도록 하겠습니다.
먼저 위와 같이 2개의 ViewController를 만들어 주세요.
하나는 부모뷰 (자식으로 이동할 수 있는 버튼 등을 구현해주세요.)
하나는 자식뷰 (예제에서는 부모뷰와 구분하기 위해서 하나의 UILabel를 추가했습니다.)
iOS의 Navigation Control은 Stack구조로 생각하시면 됩니다.
Push로 새로운 자식뷰를 호출하고
Pop을 통해 다시 부모뷰로 되돌아가는 구조입니다.
그럼 당연하게도 Top에 있는 ViewController가 화면에 노출되겠죠? 😀
// Push
func pushView() {
let vc = DetailViewController()
self.navigationController?.pushViewController(vc, animated: true)
}
// Pop
func popView() {
self.navigationController?.popViewController(animated: true)
}
Push와 Pop을 하기 위해서는 self.navigationController 객체를 통해서 호출해야 합니다.
(navigationController, 이름 그대로 navigation을 control 한다고 생각하시면 편합니다)
1.push를 할 때는 pushViewController(viewController:, animated:)를 호출
어느 View를 호출하는 지에 대한 parameter와 animation을 동작하며 View전환이 일어나는 지에 대한 parameter를 넘겨줍니다.
2.pop를 할 때는 popViewController(animated:)를 호출
pop과 마찬가지로 animation을 동작하며 View전환이 일어나는 지에 대한 parameter를 넘겨줍니다.
하지만 일반적으로 Back 버튼이 생기기 때문에 수동적으로 뒤로가기가 필요할 시에 위 함수를 이용해줍니다!
하지만 어떤 기준 View가 있어야 push를 하고 무한대로 pop을 하지 않겠죠?
그래서 rootView를 지정해주시면 됩니다!
func application(_ application:UIApplication, didFinishLaunchingWithOptionslaunchOptions:[UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
window = UIWindow(frame:UIScreen.main.bounds)
window?.makeKeyAndVisible()
let rootViewcontroller = UINavigationController(rootViewController: NavigationViewController())
window?.rootViewController = rootViewcontroller
return true
}
먼저 UINavigationController(rootViewController:)를 통해서 rootview를 지정해주시고
window?.rootViewController에 rootview를 넣어주시면 됩니다😀😀😀
화면을 전환하는 방법은 이 방법이외에도 present를 이용하거나 segue를 이용하는 등
다양하지만 오늘은 UINavigationController를 코드로 구현하는 법에 대해 공부해보았습니다.
UINavigationController는 Stack과 같이 push/pop을 통해 view가 전환되고
rootview가 꼭 필요한 것만 알아두고 더 공부하면 될 것 같습니다 :)
Reference
아직 모르는 것이 많고 알아가는 과정입니다.
잘못된 것이 있다면 댓글로 남겨주신다면 감사하겠습니다! 😊
'Swift' 카테고리의 다른 글
Literal Initializer 만들기 (0) | 2019.05.20 |
---|---|
flatMap() 정리하기. map(), compactMap() 과의 차이 (0) | 2019.04.18 |
Swinject로 DI(Dependency Injection)패턴 적용하기 (1) | 2019.04.11 |
Objc와 Swift코드를 같이 사용하기. (0) | 2019.03.07 |