2013-08-22 38 views
9

Trong bảng phân cảnh, tôi có bộ điều khiển chế độ xem giới thiệu bị mờ dần thành UINavigationController.Nhận UINavigationController do storyboard định nghĩa từ AppDelegate

 | |  | | 
    -> | | -> | |  
     | |  | | 
    ViewCtrl NavCtrl 

Tôi muốn tham khảo bộ điều khiển điều hướng từ ứng dụng đại biểu (như câu trả lời @Guillaume thực hiện trong this question).

Đây là cách tôi đang cố gắng để truy cập vào nó:

UIApplication.sharedApplication.delegate.window.rootViewController.navigationController; 

Nhưng bộ điều khiển chuyển hướng là con số không.

Bất kỳ khái niệm nào tại sao navController là không hoặc tôi có thể làm gì để có tham chiếu đến nó?

+0

Bạn đã đặt ID bảng phân cảnh cho UINavigationController chưa? Nếu không, bạn nên làm điều đó trong bảng phân cảnh của bạn. Sau đó, bạn không cần tất cả điều đó để truy cập vào bộ điều khiển điều hướng của bạn. Bạn sẽ chỉ cần [self.storyboard instantiateViewControllerWithIdentifier: @ "myID"]. Tôi giả sử bạn gọi từ bộ điều khiển xem của bạn. Để truy cập một bộ điều khiển điều hướng như bạn muốn, điều đó sẽ chỉ có thể nếu rootViewController của bạn nằm trong một UINavigationController. – rocir

+0

Cảm ơn @rocir! Điều đó có vẻ đầy hứa hẹn. Phản đối duy nhất của tôi là đã có một UINavigationController khởi tạo, và tôi muốn có một tham chiếu đến cái đó. Tôi không nghĩ rằng tôi muốn khởi tạo một bộ điều khiển nav thứ hai. – bbrame

+0

Nhưng cách này bạn đang làm bạn sẽ không làm cho nó bởi vì rootViewController của bạn không nằm trong một UINavigationController. Ngoài ra, tại thời điểm này, UIViewController chưa được khởi tạo. Vì vậy, bạn có bất kỳ segue kết nối hai bộ điều khiển xem? – rocir

Trả lời

23
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" 
                 bundle: nil]; 

UINavigationController *controller = (UINavigationController*)[mainStoryboard 
        instantiateViewControllerWithIdentifier: @"<Controller ID>"]; 

Bạn chỉ định trình nhận dạng bộ điều khiển cho bộ điều khiển điều hướng trong thanh tra thuộc tính của bộ điều khiển điều hướng.

+0

Nó nằm trong "Trình kiểm tra nhận dạng" (thứ 3 từ trái sang). – Ali

+2

điều này sẽ trả lại một phiên bản mới của bộ điều khiển điều hướng mỗi lần –

+0

@MohamedElkassas chính xác. nhận được bất kỳ bộ điều khiển từ bảng phân cảnh là "instantiating" đối tượng mới mỗi lần. không có điều gì như "ví dụ được chia sẻ" từ bảng phân cảnh. nếu bạn muốn ví dụ được chia sẻ như vậy, bạn nên khởi tạo nó một lần trên appdelegate, và sau đó truy cập nó từ khắp mọi nơi trong ứng dụng của bạn thông qua appdelegate. –

2

Vì vậy, giải pháp của Arsen có vẻ đẹp nhưng tôi không biết làm thế nào để có được tên của bảng phân cảnh của tôi lol. Có gì làm việc cho tôi là

UINavigationController *navigationController = (UINavigationController*)_window.rootViewController; 
AVDashboardViewController *dashBoardViewController = 
(AVDashboardViewController*)[navigationController.viewControllers objectAtIndex:1];//since on index 0 I have my login screen and index 1 is the home screen 

Bắt tham khảo của NavigationController trên appdelegate có vẻ như thực hành mã hóa xấu, nhưng trong trường hợp của tôi, tôi cần nó vì nó là nơi mà các

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo 

có vị trí, đó là một trong những phương thức được gọi khi nhận được thông báo. Tôi cũng gặp khó khăn về cách cập nhật bộ điều khiển chuyển hướng một lần tôi nhận được thông báo, như vậy có lẽ off topic nhưng đây là một tip miễn phí:

UIBarButtonItem *notiButton = [[UIBarButtonItem alloc] initWithTitle: @"Received push!" style: UIBarButtonItemStyleBordered target:self action:nil]; 

[[dashBoardViewController navigationItem] setLeftBarButtonItem:notiButton animated:YES]; 

[navigationController popToViewController:dashBoardViewController animated:YES]; 

Hy vọng nó sẽ giúp!

Các vấn đề liên quan