2012-09-29 26 views
5

xin lỗi nếu câu hỏi của tôi nghe có vẻ ngu ngốc đối với một số bạn. Tôi tương đối mới với iOS Development nhưng tôi phải chuyển một ứng dụng cho iOS6. Ứng dụng hoạt động hoàn hảo trên iOS 5 và XCode 4.3.2 nhưng tôi gặp phải một lỗi lạ với Xcode 4.5 trên trình giả lập iPhone 6.0. Sau khi màn hình ban đầu được nạp tôi có thể nhấn bất kỳ nút nào tôi muốn, và tôi nhận được lỗi:Segue không hoạt động với iOS6

`Terminating app due to uncaught exception 'NSGenericException', reason: 'Could not find a navigation controller for segue 'register'. Push segues can only be used when the source controller is managed by an instance of UINavigationController.` 

Phương pháp prepareForSegue của StartScreenViewController trông như thế này

if ([[segue identifier] isEqualToString:@"register"] || [[segue identifier] isEqualToString:@"forgotPassword"]) { 
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:[segue destinationViewController]]; 
    appDelegate.window.rootViewController = navController; 
} 

Thiết lập một breakpoint cho tôi thấy rằng phương pháp vẫn được gọi là corectly, nhưng sau khi PrepareForSegue kết thúc, ứng dụng bị lỗi với lỗi đã đề cập ở trên. Ai có thể chỉ cho tôi đi đúng hướng không?

Thank you very much Martin

Trả lời

5

Bởi vì bạn đang sử dụng Cocoa push segueđang tìm kiếm một bộ điều khiển chuyển hướng tổ tiên trong hệ thống phân cấp của StartScreenViewController.

  • Nếu tìm thấy nó, nó sẽ sử dụng nó để tự động đẩy bộ điều khiển chế độ xem mới lên ngăn xếp của bộ điều khiển điều hướng đó.
  • Vì không tìm thấy ứng dụng, ứng dụng của bạn đang gặp sự cố.

prepareForSegue: tồn tại để bạn có thể cấu hình VC đó là về để có được tự động hiển thị bởi iOS. Bạn không có trách nhiệm hiển thị VC, đó là những gì bạn có vẻ đang làm khi bạn đặt window.rootViewController.

Bạn có thể muốn đọc qua các tài liệu: http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/Introduction/Introduction.html

5

Bạn có thể nói "các ứng dụng đang làm việc một cách hoàn hảo", nhưng thực tế là mã bạn trích dẫn luôn luôn rất sai, vì vậy nó có vẻ rằng sai quấy này là hiện đang được tiếp xúc. Bạn không bao giờ nên thay đổi bộ điều khiển xem gốc của cửa sổ ở giữa ứng dụng; bạn nên đặt nó một lần khi khởi động và không bao giờ trở lại. Và, như Joshua đã nói đúng, chuẩn bị cho một segue không phải là một thời gian cho bạn để gây rối với cơ cấu điều khiển xem, mà segue chính nó về để mess với.

Bạn có hộp đựng giỏ trên tay. Bạn nên dừng lại và hiểu iOS và xem bộ điều khiển (và bảng phân cảnh) trước khi bạn thực hiện một bước khác, vì bạn có thể sẽ trích xuất toàn bộ kiến ​​trúc của ứng dụng này để làm đúng. Dưới đây là một số trợ giúp:

http://www.apeth.com/iOSBook/ch19.html

2

Tôi có cùng một vấn đề. Ứng dụng hoạt động tốt trên thiết bị ios6, khi tải xuống kho ứng dụng biểu mẫu, nhưng cùng một mã không hoạt động trên thiết bị hoặc trình mô phỏng. Rất lạ.

cấu trúc ứng dụng của tôi là như sau:

NavigationController ->UIViewController (có PageControl, giữ nhiều trang, theo chiều ngang cuộn) ->UITableViewController (đại diện cho một danh sách các tin tức cho một thể loại), và khi người dùng nhấp vào một tin tức, nhận được DetailsViewController (ví dụ về UIViewController).

Đây là mã từ prepareForSegue:

if ([[segue identifier] isEqualToString:@"ShowTelegrafDetails"]){ 
    TelegrafDetailsViewController *details = (TelegrafDetailsViewController*)segue.destinationViewController; 

    NSIndexPath *myIndexPath = [self.tableView indexPathForSelectedRow];  

    if([self isItPad]) 
     details.linkFromTableView = [[otherNews objectAtIndex:myIndexPath.row] link]; 
    else 
     details.linkFromTableView = [[[myViewController.itemMatrix objectAtIndex:[self calculateCurrentPage]] objectAtIndex:myIndexPath.row] link]; 

    NSLog(@"%@",segue.sourceViewController); 
    NSLog(@"%@",segue.destinationViewController); 

    [self.myViewController.navigationController pushViewController:details animated:YES]; 
    } 

Có vẻ như là điều khiển xem nguồn được thiết lập như nó là vụ phải, tôi sử dụng cốt truyện và NavigationController được tự động thiết lập. Tôi không biết nếu tôi phải thiết lập RootViewController một nơi nào đó một cách rõ ràng, nhưng nó có thể được khôn lanh để thiết lập nó trong AppDelegate, bởi vì tôi có hai phân cấp xem nhiều hơn giữa các đại biểu và một lớp học nên được root (UITableViewController).

Nếu có ai biết điều gì đó về nó, tôi luôn biết ơn, nếu không tôi có thể sử dụng một số hướng dẫn. Tôi đã đọc tài liệu của Apple về chủ đề này, nhưng tôi không thể hiểu đầy đủ về nó khi nói đến tình huống phức tạp này.

Ngoài ra, nếu tôi tìm thấy bất kỳ giải pháp nào, tôi sẽ sẵn sàng đăng nó ở đây như một ông chủ. : D

Thanx trước.

EDIT:

tôi đã quản lý để khắc phục vấn đề này. Chỉ cần xóa phân đoạn và đặt mã từ PrepareForSegue vào didSelectRowAtIndexPath, với các chỉnh sửa thích hợp. Nó không phải là một giải pháp lý tưởng, nhưng sửa chữa vấn đề. Mặc dù, tôi có kế hoạch hỗ trợ 4,3 thiết bị và bảng phân cảnh không phải là một tùy chọn trong trường hợp đó.

Ngoài ra, tôi đã kiểm tra mã đôi, phát hiện ra rằng RootViewController được tạo và hiển thị chính xác, NavigationController hoạt động tốt và tôi vẫn không thể hiểu tại sao segues không hoạt động.

Chúc mừng.

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