2013-12-12 16 views
10

Tôi đang bận xây dựng một ứng dụng - rằng khi ra mắt lần đầu tiên nó yêu cầu người dùng phải thực hiện hai điều:Instantiating một View Controller lập trình với Storyboard từ appdelegate

  1. Chọn một quốc gia
  2. Chấp nhận T & Cs

Từ đó đến bộ điều khiển chế độ xem nhà.

Sự cố tôi hiện đang gặp phải đang đẩy trình điều khiển chế độ xem đầu tiên lên màn hình từ đại biểu ứng dụng của tôi. Tôi đang sử dụng storyboards/Xcode 5/iOS7

Dưới đây là đoạn code tôi đã đưa ra:

UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController; 
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main_iPhone" bundle: nil]; 
BBCounterySettingsViewController *controller = (BBCounterySettingsViewController*)[mainStoryboard instantiateViewControllerWithIdentifier: @"CountrySettings"]; 
[navigationController pushViewController:controller animated:NO]; 

Vấn đề là treo ứng dụng khi nó chạm vào dòng cuối cùng của mã với các lỗi sau:

* Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIViewController pushViewController:animated:]: unrecognized selector sent to instance 0x8e9a400'

Bất kỳ ai có ý tưởng gì tôi đang làm sai?

Trả lời

11

Bạn đang mong đợi self.window.rootViewControllerUINavigationController nhưng đó là UIViewController. Điều này có nghĩa là bộ điều khiển xem ngoài cùng trong bảng phân cảnh của bạn có kiểu sai.

Cách tốt hơn để có được UINavigationController (Điều gì sẽ hoạt động trong trường hợp này) là sử dụng thuộc tính self.navigationController trên bất kỳ UIViewController nào.

Từ những gì tôi hiểu bạn muốn trình bày chế độ xem lần đầu tiên người dùng chạy để người dùng chọn một số nội dung. Vậy thì bạn nên làm là trình bày một bộ điều khiển xem phương thức, như thế này:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
//isFirstRun is some boolean you use to determine if it's the first run 
if(isFirstRun){ 
    BBCounterySettingsViewController *controller = (BBCounterySettingsViewController *)[mainStoryboard instantiateViewControllerWithIdentifier: @"CountrySettings"]; 
    [self.window.rootViewController presentViewController: controller animated:YES completion:nil]; 
} 
+0

Tôi nghĩ rằng tôi đang sử dụng phương pháp này một cách sai lầm. Bộ điều khiển chế độ xem này không cần điều hướng ở bất kỳ nơi nào khác. Chỉ cần được miễn nhiệm. Phần còn lại của ứng dụng là ứng dụng dựa trên thanh tab. Trong ứng dụng ủy quyền self.navigationController không tồn tại? – Tander

+0

Tôi sẽ cập nhật câu trả lời của mình bằng một mẹo mới sau đó :) – Rick

7

Có hai điều bạn cần làm:

  1. Trong Storyboard bạn đã đề cập đến tên điều khiển (ví dụ LoginView) và cho phép sử dụng storyboard ID
  2. Sau đó, bạn có sử dụng các dòng dưới đây

    loginView = [storyboard instantiateViewControllerWithIdentifier:@"LoginView"]; 
    [(UINavigationController*)self.window.rootViewController pushViewController:loginView animated:NO]; 
    

Hy vọng điều này sẽ hữu ích. Hãy cho tôi biết nếu bạn vẫn gặp sự cố.

+0

Cảm ơn điều này cũng đã giúp. – Tander

+0

Nếu nhúng viewController của bạn vào một số UINavigationController, bạn cũng có thể sử dụng phương thức 'instantiateInitialViewController()' thom 'UIStoryBoard'. Thao tác này sẽ tự động tải viewController được đánh dấu bằng một mũi tên trên bảng phân cảnh của bạn. Nếu viewController này là một container, con của nó cũng sẽ tải. – Vinzzz

0
[self performSegueWithIdentifier:@"buyListSegue" sender:sender]; 
+1

Câu trả lời này có thể làm với một số giải thích ... –

+0

Không hữu ích. Các phân đoạn không thể xảy ra từ AppDelegate hoặc viewControllers không có phần nào của một UINavigationController – Tander

0

Tôi nghĩ rằng nhận dạng điều khiển "CountrySettings" được thiết lập để điều khiển sai. Bạn không nhận được NavigationController nơi bạn có thể gọi pushViewController ...

+0

Giải quyết vấn đề, cảm ơn. Câu trả lời được đánh dấu là vấn đề. – Tander

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