AppDelegate에서 최상위 UIVIew Controller에 액세스하는 방법
이번에는 그 방법에 대해 조사를 진행했다.
준비
세 개의 UIVIewController를 Segue 순서로 시작하는 예제 프로그램을 만듭니다.
파란색 UIVIew Controller의 클래스 이름은 FirstView Controller이고 노란색 UIVIew Controller의 클래스 이름은 SecondView Controller이며 빨간색 UIVIew Controller의 클래스 이름은 ThirdView Controller입니다.
활용단어참조
이번에는 App Delegate의 application Will Enter Foregrond에 처리가 기술되었습니다.
홈 버튼과 홈 표시등을 누르면 프로그램을 배경으로 하고 프론트 데스크톱으로 돌아갈 때 하는 활동입니다.
AppDelegate.swiftimport UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
-------------------- (中略) --------------------
func applicationWillEnterForeground(_ application: UIApplication) {
//一番手前のViewControllerを取得
var viewController = UIApplication.shared.keyWindow?.rootViewController
//PresentedViewControllerが取得できなくなるまでループ
while viewController!.presentedViewController != nil {
let presentedViewController = viewController!.presentedViewController
//UIAlertControllerは対象外とする
if let alertController = presentedViewController as? UIAlertController {
//一番上がUIAlertControllerであればUIAlertControllerを閉じる
alertController.dismiss(animated: true, completion: nil)
break
} else {
//UIAlertControllerでなければ取得
viewController = presentedViewController
}
}
var message: String = ""
if viewController is FirstViewController {
message = "1番目のViewControllerです"
}
if viewController is SecondViewController {
message = "2番目のViewControllerです"
}
if viewController is ThirdViewController {
message = "3番目のViewControllerです"
}
let alertController: UIAlertController = UIAlertController(title: "", message: message, preferredStyle: .alert)
let defaultAction: UIAlertAction = UIAlertAction(title: "OK", style: .default, handler: nil)
alertController.addAction(defaultAction)
viewController!.present(alertController, animated: true, completion: nil)
}
}
맨 위의 UIVIew Controller를 가져와 경고를 보는 과정을 설명합니다.
예시 프로그램을 이동하면 프론트 데스크톱이 될 때 현재 표시된 화면을 경보로 표시합니다.
해설
우선 UIApplication에서 획득rootViewController(맨 앞의 UIVIew Controller).var viewController = UIApplication.shared.keyWindow?.rootViewController
그런 다음 rootViewController 루프에서 가져옵니다presentedViewController.while viewController!.presentedViewController != nil {
let presentedViewController = viewController!.presentedViewController
마지막으로 되돌아오는 presented View Controller는 맨 위의 UIVIew Controller입니다. 여기서 주의해야 합니다.
디스플레이 경보UIAlertController와 디스플레이 App ExtensionsUIActivityViewController는 모두 UIVIew Controller를 계승했기 때문에presentedView Controller에서 되돌아옵니다.
따라서 맨 위에 UIAlert Controller 또는 UIActive View Controller가 있으면 앞에 있는 UIVIew Controller가 맨 위에 있는 UIVIew Controller입니다.
이번 샘플도 UIAlert Controller를 표시할 수 있기 때문에 UIAlert Controller라면 끄고 앞의 UIVIew Controller를 맨 위의 UIVIew Controller로 받습니다.while viewController!.presentedViewController != nil {
let presentedViewController = viewController!.presentedViewController
//UIAlertControllerは対象外とする
if let alertController = presentedViewController as? UIAlertController {
//一番上がUIAlertControllerであればUIAlertControllerを閉じる
alertController.dismiss(animated: true, completion: nil)
break
} else {
//UIAlertControllerでなければ取得
viewController = presentedViewController
}
}
"is"를 사용하여 클래스 이름과 유형을 비교하면 어느 UIVIew Controller가 가장 위에 있는지 알 수 있습니다.var message: String = ""
if viewController is FirstViewController {
message = "1番目のViewControllerです"
}
if viewController is SecondViewController {
message = "2番目のViewControllerです"
}
if viewController is ThirdViewController {
message = "3番目のViewControllerです"
}
Reference
이 문제에 관하여(AppDelegate에서 최상위 UIVIew Controller에 액세스하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/NaoSekig/items/fb8270503910bbe22082
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
이번에는 App Delegate의 application Will Enter Foregrond에 처리가 기술되었습니다.
홈 버튼과 홈 표시등을 누르면 프로그램을 배경으로 하고 프론트 데스크톱으로 돌아갈 때 하는 활동입니다.
AppDelegate.swift
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
-------------------- (中略) --------------------
func applicationWillEnterForeground(_ application: UIApplication) {
//一番手前のViewControllerを取得
var viewController = UIApplication.shared.keyWindow?.rootViewController
//PresentedViewControllerが取得できなくなるまでループ
while viewController!.presentedViewController != nil {
let presentedViewController = viewController!.presentedViewController
//UIAlertControllerは対象外とする
if let alertController = presentedViewController as? UIAlertController {
//一番上がUIAlertControllerであればUIAlertControllerを閉じる
alertController.dismiss(animated: true, completion: nil)
break
} else {
//UIAlertControllerでなければ取得
viewController = presentedViewController
}
}
var message: String = ""
if viewController is FirstViewController {
message = "1番目のViewControllerです"
}
if viewController is SecondViewController {
message = "2番目のViewControllerです"
}
if viewController is ThirdViewController {
message = "3番目のViewControllerです"
}
let alertController: UIAlertController = UIAlertController(title: "", message: message, preferredStyle: .alert)
let defaultAction: UIAlertAction = UIAlertAction(title: "OK", style: .default, handler: nil)
alertController.addAction(defaultAction)
viewController!.present(alertController, animated: true, completion: nil)
}
}
맨 위의 UIVIew Controller를 가져와 경고를 보는 과정을 설명합니다.예시 프로그램을 이동하면 프론트 데스크톱이 될 때 현재 표시된 화면을 경보로 표시합니다.
해설
우선 UIApplication에서 획득rootViewController(맨 앞의 UIVIew Controller).var viewController = UIApplication.shared.keyWindow?.rootViewController
그런 다음 rootViewController 루프에서 가져옵니다presentedViewController.while viewController!.presentedViewController != nil {
let presentedViewController = viewController!.presentedViewController
마지막으로 되돌아오는 presented View Controller는 맨 위의 UIVIew Controller입니다. 여기서 주의해야 합니다.
디스플레이 경보UIAlertController와 디스플레이 App ExtensionsUIActivityViewController는 모두 UIVIew Controller를 계승했기 때문에presentedView Controller에서 되돌아옵니다.
따라서 맨 위에 UIAlert Controller 또는 UIActive View Controller가 있으면 앞에 있는 UIVIew Controller가 맨 위에 있는 UIVIew Controller입니다.
이번 샘플도 UIAlert Controller를 표시할 수 있기 때문에 UIAlert Controller라면 끄고 앞의 UIVIew Controller를 맨 위의 UIVIew Controller로 받습니다.while viewController!.presentedViewController != nil {
let presentedViewController = viewController!.presentedViewController
//UIAlertControllerは対象外とする
if let alertController = presentedViewController as? UIAlertController {
//一番上がUIAlertControllerであればUIAlertControllerを閉じる
alertController.dismiss(animated: true, completion: nil)
break
} else {
//UIAlertControllerでなければ取得
viewController = presentedViewController
}
}
"is"를 사용하여 클래스 이름과 유형을 비교하면 어느 UIVIew Controller가 가장 위에 있는지 알 수 있습니다.var message: String = ""
if viewController is FirstViewController {
message = "1番目のViewControllerです"
}
if viewController is SecondViewController {
message = "2番目のViewControllerです"
}
if viewController is ThirdViewController {
message = "3番目のViewControllerです"
}
Reference
이 문제에 관하여(AppDelegate에서 최상위 UIVIew Controller에 액세스하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/NaoSekig/items/fb8270503910bbe22082
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
var viewController = UIApplication.shared.keyWindow?.rootViewController
while viewController!.presentedViewController != nil {
let presentedViewController = viewController!.presentedViewController
while viewController!.presentedViewController != nil {
let presentedViewController = viewController!.presentedViewController
//UIAlertControllerは対象外とする
if let alertController = presentedViewController as? UIAlertController {
//一番上がUIAlertControllerであればUIAlertControllerを閉じる
alertController.dismiss(animated: true, completion: nil)
break
} else {
//UIAlertControllerでなければ取得
viewController = presentedViewController
}
}
var message: String = ""
if viewController is FirstViewController {
message = "1番目のViewControllerです"
}
if viewController is SecondViewController {
message = "2番目のViewControllerです"
}
if viewController is ThirdViewController {
message = "3番目のViewControllerです"
}
Reference
이 문제에 관하여(AppDelegate에서 최상위 UIVIew Controller에 액세스하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/NaoSekig/items/fb8270503910bbe22082텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)