2009-05-25 25 views
6

Tôi có một ứng dụng hoàn toàn hoạt động trên hệ điều hành iPhone 2.2.1 nhưng khi tôi cố gắng chạy nó trên iPhone os 3.0 nó nghiền nát."Thay đổi các đại biểu của một thanh tab" ngoại lệ

Đây là lỗi tôi nhận được từ giao diện điều khiển:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Changing the delegate of a tab bar managed by a tab bar controller is not allowed.' 

Có lẽ nó xảy ra bởi vì tôi đang thay đổi quan điểm của một bộ điều khiển xem một số lập trình.

Đây là mã:

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear: animated]; 

    self.view = current_controller.view; 
    [current_controller viewWillAppear: NO]; 
    [current_controller viewDidAppear: NO]; 
} 

Có một lỗi xảy ra trong phần này của mã và nếu có làm thế nào tôi có thể sửa chữa nó? Tại sao nó có thể xảy ra?

Cảm ơn bạn trước, Ilya.

Trả lời

4

Ông Ernst ở trên cho thấy ấn tượng rằng ông nhìn thấy một cái gì đó trong mã Ilya tạo thành "yanking một cái nhìn ra từ dưới một Controller". Điều đó có thể khiến bạn nhìn chằm chằm vào mã trong một thời gian dài và đó không phải là nơi mà vấn đề thực sự là. Tôi đã đăng sự cố này trên Diễn đàn nhà phát triển Apple http://discussions.apple.com/message.jspa?messageID=10259835#10259835 và tôi được thông báo rằng 'NSInternalInconsistencyException' là sự cố với tệp .xib (Trong Trình tạo giao diện). Sử dụng thông tin này tôi tìm thấy giải pháp sau đây. Tôi nghĩ rằng một số tên tôi đưa ra ở đây là chung chung và sẽ giúp đỡ người khác cố gắng khắc phục vấn đề này. Để xem lại vấn đề, tham chiếu xib biên dịch và chạy hoàn hảo trên 2.x, biên dịch trên 3.x và đưa ra thông báo lỗi ở trên khi bạn cố chạy ứng dụng trong trình mô phỏng 3.0. Tôi đã có một đại biểu trong một thanh tab. Khi xem các cửa hàng tham chiếu trong bộ dựng giao diện, tôi có "Nhiều", "Chủ sở hữu tệp", "Tab Bar" và "Tab Bar Controller" làm các cửa hàng tham chiếu. Khi tôi xóa "Tab Bar" khỏi Cửa hàng tham chiếu, ứng dụng của tôi chạy trong Trình mô phỏng 3.0. Nó cũng được biên dịch và chạy trên 2.x để tham chiếu "Tab Bar" không được yêu cầu bởi 2.x. ... Flash Gordon

+0

Đó chính xác là những gì tôi đã làm! :) –

0

Rất đơn giản, bạn không thể làm điều đó. Yanking xem ra từ dưới một UIViewController là một cách chắc chắn để có được một vụ tai nạn.

Xem hướng dẫn trên thanh tab mà Apple cung cấp để xem cách thực hiện đúng cách.

0

Đây là một vấn đề không nhỏ. Ai đó phải đã đăng một ví dụ về loại bỏ một khung nhìn từ dưới một ViewController bởi vì rất nhiều người đã làm nó. Và mặc dù tất cả các cuộc nói chuyện về cách "xấu" nó được, nó làm việc trong 2.x. Ngay cả bài viết của Apple cũng không giải quyết được vấn đề về kiến ​​trúc. Hầu hết mọi người sẽ viết một kết hợp .h/.m để xử lý mỗi khung nhìn của trình điều khiển con. Ví dụ táo dường như chỉ hoạt động trong tập tin .m điều khiển thanh tabbarcontroller.

0

Tôi tìm thấy giải pháp sau đây cho tôi:

  1. Subclass UITabBarController
  2. Trong Interface Builder đặt "Custom Class> Class" Thuộc tính của UITabBar của bạn đến lớp mới của bạn
  3. Thêm mã sau đây để lớp học của bạn

    -(void)tabBar:(UITabBar *)tabBar willBeginCustomizingItems:(NSArray *)items{ 
        id modalViewCtrl = [[[self view] subviews] objectAtIndex:1]; 
        if([modalViewCtrl isKindOfClass:NSClassFromString(@"UITabBarCustomizeView")] == YES) 
         ((UINavigationBar*)[[modalViewCtrl subviews] objectAtIndex:0]).tintColor = [UIColor blackColor]; 
    } 
    

Hy vọng điều này sẽ giúp ...

7

Trong hầu hết các trường hợp, bạn có thể sử dụng UITabBarControllerDelegate thay thế. Nó có các phương thức tương tự như UITabBarDelegate và tránh ngoại lệ như vậy. Đối với, ví dụ, thay vì:


- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item { 

    int index = [tabBar determinePositionInTabBar:item]; // custom method 
    [tabBar doSomethingWithTabBar]; 
    [item doSomethingWithItem]; 
    [item doSomethingWithItemAndIndex:index]; 
} 

bạn có thể viết:


- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController { 

    UITabBarItem *item = [tabBarController.tabBar selectedItem]; 
    int index = [tabBarController.tabBar determinePositionInTabBar:item]; // custom method 
    [tabBarController.tabBar doSomethingWithTabBar]; 
    [item doSomethingWithItem]; 
    [item doSomethingWithItemAndIndex:index]; 
} 
+1

Lựa chọn thay thế tốt (Y) –

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