루트 뷰 컨트롤러를 입수하는 방법
루트 뷰 컨트롤러 인스턴스가 필요합니다.
저는 그 방법을 시도했습니다.
UIViewController *rootViewController = (UIViewController*)[[[UIApplication sharedApplication] keyWindow] rootViewController];
반환: null:
또, 컨트롤러의 어레이를 취득하려고 하면, 다음과 같이 됩니다.
NSArray *viewControllers = self.navigationController.viewControllers;
하나의 컨트롤러만 반환되지만 루트 뷰 컨트롤러는 아닙니다.
네비게이션 컨트롤러에서 가져오려고 하면:
UIViewController *root = (UIViewController*)[self.navigationController.viewControllers objectAtIndex:0];
반환: null:
왜 그런지 알아요?루트 뷰 컨트롤러의 인스턴스를 가져오려면 그 밖에 무엇을 시도해 볼 수 있습니까?
감사해요.
접속을 시도하고 있는 경우rootViewController
appDelegate를 설정합니다.이것을 시험해 보세요.
목표-C
YourViewController *rootController = (YourViewController*)[[(YourAppDelegate*)
[[UIApplication sharedApplication]delegate] window] rootViewController];
재빠르다
let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
let viewController = appDelegate.window!.rootViewController as YourViewController
스위프트 3
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let viewController = appDelegate.window!.rootViewController as! YourViewController
Swift 4.2
let viewController = UIApplication.shared.keyWindow?.rootViewController as? YourViewController
Swift 5.1 및 5.2
let viewController = UIApplication.shared.windows.first?.rootViewController as? YourViewController
목표-C
UIViewController *controller = [UIApplication sharedApplication].keyWindow.rootViewController;
Swift 2.0
let viewController = UIApplication.sharedApplication().keyWindow?.rootViewController
스위프트 5
let viewController = UIApplication.shared.keyWindow?.rootViewController
여기서 @0x7ffffff에 의해 제안되었듯이 UINavigation Controller를 사용하면 다음과 같은 작업을 쉽게 수행할 수 있습니다.
YourViewController *rootController =
(YourViewController *)
[self.navigationController.viewControllers objectAtIndex: 0];
위 답변의 코드는 UINavigation 컨트롤러(사용자가 가지고 있는 경우)를 반환하며, 이것이 필요한 경우 를 사용할 수 있습니다.self.navigationController
.
Swift 5 이후에는 다음 방법을 사용할 것을 권장합니다.
UIApplication.shared.windows.last?.rootViewController
를 사용합니다. last 는 top view Controller is active 를 반환합니다.
.first는 위에 창이 있어야만 동작하는 라이브러리에서 작동하지 않을 수 있습니다.
예를 들어 다음과 같습니다.Admob.광고가 표시되지 않아 시트 또는 풀스크린 커버 사용 시 아래에 숨겨진 창을 호출하고 있습니다.
메모: Navigation View에 필요한 광고를 표시하려고 합니다.표시하지 않으면 광고는 실행되지 않습니다.
예: NavigationView {View1}
도움이 됐으면 좋겠어요.
iOS 15
장면 및 일부 API가 권장되지 않는 경우(예:UIApplication.shared.keyWindow
가장 보편적인 접근법은 다음과 같습니다.
let scene = UIApplication.shared.connectedScenes
.first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene
let rootViewController = scene?
.windows.first(where: { $0.isKeyWindow })?
.rootViewController
주의: 사용 중인 앱이 여러 개의 창/씬을 지원하는 경우 여러 개의 "root View Controller"가 있으며 이 코드는 사용자를 위한 것이 아닙니다.
특별한 이유가 없는 한 루트 컨트롤러에서 다음을 수행합니다.
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(onTheEvent:)
name:@"ABCMyEvent"
object:nil];
통지하고 싶은 경우:
[[NSNotificationCenter defaultCenter] postNotificationName:@"ABCMyEvent"
object:self];
스위프트 3
let rootViewController = UIApplication.shared.keyWindow?.rootViewController
이 기능은 어디에서나 호출할 수 있습니다.옵션으로 반환되므로 주의해 주십시오.
/// EZSwiftExtensions - Gives you the VC on top so you can easily push your popups
var topMostVC: UIViewController? {
var presentedVC = UIApplication.sharedApplication().keyWindow?.rootViewController
while let pVC = presentedVC?.presentedViewController {
presentedVC = pVC
}
if presentedVC == nil {
print("EZSwiftExtensions Error: You don't have any views set. You may be calling them in viewDidLoad. Try viewDidAppear instead.")
}
return presentedVC
}
이 기능은 다음 항목에 표준 기능으로 포함되어 있습니다.
https://github.com/goktugyil/EZSwiftExtensions
Swift 3: Chage View Controller(Out Segue)를 사용하여 AnyObject Use: Identity MainPageViewController(Identity MainPageViewController on Target ViewController)를 전송합니다.
let mainPage = self.storyboard?.instantiateViewController(withIdentifier: "MainPageViewController") as! MainPageViewController
var mainPageNav = UINavigationController(rootViewController: mainPage)
self.present(mainPageNav, animated: true, completion: nil)
또는 뷰 컨트롤러를 변경하여 데이터를 전송하려는 경우
let mainPage = self.storyboard?.instantiateViewController(withIdentifier: "MainPageViewController") as! MainPageViewController
let dataToSend = "**Any String**" or var ObjectToSend:**AnyObject**
mainPage.getData = dataToSend
var mainPageNav = UINavigationController(rootViewController: mainPage)
self.present(mainPageNav, animated: true, completion: nil)
언급URL : https://stackoverflow.com/questions/12418177/how-to-get-root-view-controller
'source' 카테고리의 다른 글
Swift에서 Unix Epoch Time 가져오기 (0) | 2023.04.09 |
---|---|
Windows에서 Git에서 파일 실행 모드 권한을 만드는 방법은 무엇입니까? (0) | 2023.04.09 |
VBA에서 현재 워크시트의 경로를 얻는 방법은 무엇입니까? (0) | 2023.04.09 |
CORS 헤더 'Access-Control-Allow-Origin'이 없습니다. (0) | 2023.04.04 |
Python 2.6 JSON 디코딩 성능 (0) | 2023.04.04 |