[objective-c] 루트 뷰 컨트롤러를 얻는 방법?
루트 뷰 컨트롤러의 인스턴스가 필요합니다.
나는 그 접근법을 시도했다.
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 및 4.2
let viewController = UIApplication.shared.keyWindow!.rootViewController as! YourViewController
Swift 5 및 5.1 및 5.2
let viewController = UIApplication.shared.windows.first!.rootViewController as! YourViewController
답변
목표 -C
UIViewController *controller = [UIApplication sharedApplication].keyWindow.rootViewController;
스위프트 2.0
let viewController = UIApplication.sharedApplication().keyWindow?.rootViewController
스위프트 5
let viewController = UIApplication.shared.keyWindow?.rootViewController
답변
제안으로 여기 @의 0x7fffffff에 의해 당신이 UINavigationController가있는 경우, 할 쉽게 할 수 있습니다 :
YourViewController *rootController =
(YourViewController *)
[self.navigationController.viewControllers objectAtIndex: 0];
위 답변의 코드는 UINavigation 컨트롤러 (있는 경우)를 반환하며 이것이 필요한 경우 self.navigationController
.
답변
정당한 이유가없는 한 루트 컨트롤러에서 다음을 수행하십시오.
[[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
}
다음과 같은 표준 기능으로 포함됩니다.
답변
Swift 3 : Segue없이 ViewController를 변경하고 AnyObject
사용 : 대상 ViewController의 Identity MainPageViewController
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)