Làm cách nào để lấy bộ điều khiển chế độ xem gốc?


109

Tôi cần một phiên bản của bộ điều khiển chế độ xem gốc.

Tôi đã thử những cách tiếp cận đó:

UIViewController *rootViewController = (UIViewController*)[[[UIApplication sharedApplication] keyWindow] rootViewController];

Trả về: null :

Ngoài ra khi tôi cố gắng lấy một mảng bộ điều khiển:

NSArray *viewControllers = self.navigationController.viewControllers;

Nó chỉ trả về một bộ điều khiển, nhưng nó không phải là bộ điều khiển chế độ xem gốc của tôi.

Nếu tôi cố lấy từ bộ điều khiển điều hướng:

UIViewController *root = (UIViewController*)[self.navigationController.viewControllers objectAtIndex:0];

Trả về: null :

Bất kỳ ý tưởng tại sao? Tôi có thể thử làm gì khác để lấy một phiên bản của bộ điều khiển chế độ xem gốc của mình?

Cảm ơn.


KeyWindow là cửa sổ hoạt động, ví dụ: khi bạn hiển thị một UIAlertView, cửa sổ của UIAlertView là keyWindow nhưng nó không phải là cửa sổ của AppDelegate. ] tốt hơn.
无 夜 之 星辰

Câu trả lời:


213

nếu bạn đang cố gắng truy cập vào ứng dụng rootViewControllerbạn đã đặt trong appDelegate. thử cái này:

Objective-C

YourViewController *rootController = (YourViewController*)[[(YourAppDelegate*)
                                   [[UIApplication sharedApplication]delegate] window] rootViewController];

Nhanh

let appDelegate  = UIApplication.sharedApplication().delegate as AppDelegate
let viewController = appDelegate.window!.rootViewController as YourViewController

Swift 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

3
YourViewController * rootController = (YourViewController *) [[(YourAppDelegate *) [[UIApplication sharedApplication] ủy nhiệm] window] rootViewController];
Craig Moore

1
Trong Swift2, bạn phải sử dụng "let appDelegate = UIApplication.sharedApplication (). Ủy quyền với tư cách là! AppDelegate", để buộc mở
Jacky

Có cách nào để gán hai bộ điều khiển theo cách này để bạn có thể kéo dữ liệu từ cả hai vào đồng hồ không?
Johnny Marin

1
Đây là một cứu cánh. Cảm ơn bạn! Tôi đã mất hàng tháng trời để tìm được đoạn mã ngon lành này!
ItsMeDom

37

Objective-C

UIViewController *controller = [UIApplication sharedApplication].keyWindow.rootViewController;

Swift 2.0

let viewController = UIApplication.sharedApplication().keyWindow?.rootViewController

Swift 5

let viewController = UIApplication.shared.keyWindow?.rootViewController

3
Đây phải là câu trả lời hàng đầu. +1 Các câu trả lời khác sẽ không hoạt động nếu bạn cần tham chiếu bộ điều khiển chế độ xem gốc từ một khuôn khổ khác mà ứng dụng chính của bạn phụ thuộc vào.
C. Tewalt

10

Như được đề xuất ở đây bởi @ 0x7fffffff, nếu bạn có UINavigationController, bạn có thể thực hiện dễ dàng hơn:

YourViewController *rootController =
    (YourViewController *)
        [self.navigationController.viewControllers objectAtIndex: 0];

Mã trong câu trả lời ở trên trả về bộ điều khiển UINavigation (nếu bạn có) và nếu đây là thứ bạn cần, bạn có thể sử dụng self.navigationController.


5

Trừ khi bạn có lý do chính đáng, hãy làm điều này trong bộ điều khiển gốc của bạn:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(onTheEvent:)
                                             name:@"ABCMyEvent"
                                           object:nil];

Và khi bạn muốn thông báo cho nó:

[[NSNotificationCenter defaultCenter] postNotificationName:@"ABCMyEvent"
                                                object:self];                

2

Swift 3

let rootViewController = UIApplication.shared.keyWindow?.rootViewController

1

Cách thực hiện nhanh chóng, bạn có thể gọi nó từ bất cứ đâu, nó trả về tùy chọn, vì vậy hãy chú ý đến điều đó:

/// 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
}

Nó được bao gồm như một chức năng tiêu chuẩn trong:

https://github.com/goktugyil/EZSwiftExtensions


1

Swift 3: Chage ViewController vớiOut Segue và gửi AnyObject Sử dụng: Identity MainPageViewController trên ViewController đích

let mainPage = self.storyboard?.instantiateViewController(withIdentifier: "MainPageViewController") as! MainPageViewController

var mainPageNav = UINavigationController(rootViewController: mainPage)

self.present(mainPageNav, animated: true, completion: nil)

hoặc nếu bạn muốn Thay đổi Bộ điều khiển Chế độ xem và gửi Dữ liệu

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)  

Bạn là chàng
trai
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.