일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 스위프트
- 플러터 뷰 컨트롤러
- 노티피케이션 익스텐션
- 스위프트 테이블 뷰 셀
- swift sms
- 스위프트 카메라
- native flutter view
- swift autolayout
- 앱 백그라운드 푸시 데이터 저장
- 안드로이드 FCM
- 푸시 데이터 저장
- Flutter NativeView
- 안드로이드 앨범
- 스위프트 웹뷰
- 스위프트 푸시
- flutter rotate
- 안드로이드 에러
- silent push
- 안드로이드 바로가기
- 앱 꺼졌을 때 푸시 데이터 저장
- flutter 회전
- swift 문자
- Swift flutterview
- 안드로이드 숏컷
- Flutter UIKitView MethodChannel
- NotificationService Extension
- Swift flutterviewcontroller
- 스위프트 UserDefaults
- 스위프트 앨범
- FlutterView MethodChannel
- Today
- Total
Things take time
[SWIFT] 현재 실행 중(혹은 실행할) 앱의 최상 뷰 컨트롤러 얻기 본문
[개요]
여러 개의 뷰 컨트롤러를 갖고 있는 앱에서, 그 계층 구조에 따라 동작함이 다르므로 이를 제어해야할 일이 생긴다.
예를 들어
1) 푸시 메시지를 클릭했을 때, A라는 뷰 컨틀로러 실행되어 있다면 특정 작업을 하고.. B라는 뷰 컨트롤러가 실행중이라면 B를 종료하고 A라는 컨트롤러를 제어해야 한다면
2) 스키마를 통해 앱을 들어온 경우에도 푸시 메시지를 클릭했을 때 처럼 각 뷰 컨트롤러 작업이 다르다면
이 때 필요한게 지금 현재 앱이 백그라운드에 있다가 켜졌을 때, 현재 실행중인 뷰 컨트롤러가 뭐냐는게 중요하다. (당연한 말이지만, 앱이 처음 켜진 경우엔 지금 현재 뷰 컨트롤러는 당연히 지정한 뷰 컨트롤러다)
[코드]
1. 현재의 뷰 컨트롤러 얻는 UIApplication의 Extension
extension UIApplication { class func topViewController(base: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? { if let nav = base as? UINavigationController { return topViewController(base: nav.visibleViewController) } if let tab = base as? UITabBarController { if let selected = tab.selectedViewController { return topViewController(base: selected) } } if let presented = base?.presentedViewController { return topViewController(base: presented) } return base } }
이 코드를 사용하면, 어디서나 UIApplication.topViewController()를 통해 현재 뷰 컨트롤러를 접근할 수 있다.
2. 탭바나 네비게이션 컨트롤러 없다면
let rootVC = UIApplication.shared.keyWindow?.rootViewController let presentVC = rootVC?.presentedViewController if presentVC != nil{ if let contentVC = presentVC as? ContentViewController{ contentVC.quitView(url: urlStr) } } else{ let mainVC = rootVC as! MainViewController mainVC.webView.load(request) }
기본적으로 rootViewController를 통해 현재 앱의 가장 밑 부분에 있는 컨트롤러.. 즉 앱을 켰을 때 처음 실행되는 뷰 컨트롤러를 얻을 수 있고 presentedViewController를 통해 그 위에 얹어져 있는 가장 상단의 뷰 컨트롤러를 얻을 수 있다.
만약, presentVC가 nil이라면, 현재 띄워져 있는 뷰 컨트롤러는 루트 뷰 컨트롤러를 의미하는 것이고, 있다면 얹어진 뷰 컨트롤러를 if let 구문을 통해 찾아낸 다음 원하는 작업을 수행하면 된다.
'iOS (기능)' 카테고리의 다른 글
[SWIFT] UILabel의 text 속성(여러 색상 넣기, 폰트 바꾸기 등) (0) | 2018.03.28 |
---|---|
[SWIFT] UIImageView를 원 형(Circle) 만들기 (0) | 2018.02.26 |
[SWIFT] 공유하기! 방법 => Share Extension (0) | 2018.02.02 |
[SWIFT] 공유하기! 방법 => Action Extension (0) | 2018.02.01 |
[SWIFT] UIImageView, UIScrollView를 이용한 Pinch To Zoom(확대 기능) (2) | 2018.01.31 |