2011-09-15 28 views
75

Tôi vừa gặp sự cố hiển thị NSInvalidArgumentException với thông báo này trên một ứng dụng không hoạt động trước đây."Ứng dụng đã cố gắng trình bày một bộ điều khiển hoạt động"?

Ứng dụng đã cố gắng trình bày một bộ điều khiển hoạt động một cách khiêm tốn UITabBarController: 0x83d7f00.

Tôi có một số UITabBarController mà tôi tạo trong AppDelegate và cung cấp cho mảng đó UIViewControllers.

Một trong số chúng tôi muốn trình bày một cách bình thường khi chạm vào nó. Tôi đã làm điều đó bằng cách thực hiện các phương pháp đại biểu

- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController 

Nếu mà điều khiển xem là của lớp người tôi muốn trình bày modally, tôi trở NO và làm

[tabBarController presentModalViewController:viewController animated:YES]; 

Và bây giờ tôi nhận được lỗi đó, điều đó có nghĩa là bạn không thể trình bày một bộ điều khiển chế độ xem đang hoạt động ở một nơi khác (trong thanh tabbar ...) Tôi nên nói rằng tôi đang sử dụng XCode 4.2 Developer Preview 7, vì vậy đây là iOS 5 (Tôi biết về NDA, nhưng tôi nghĩ tôi không đưa ra bất kỳ chi tiết bị cấm nào). Tôi hiện không có cài đặt XCode để kiểm tra xem sự cố này có biên dịch với SDK iOS4 hay không, nhưng tôi gần như hoàn toàn chắc chắn là không.

Tôi chỉ muốn hỏi nếu có ai đã trải qua vấn đề này hoặc có bất cứ đề nghị

+0

Trước iOS 5, điều này không làm tăng ngoại lệ nhưng không trả lại gì. Từ iOS 5 trở đi, lệnh này sẽ đưa ra một ngoại lệ. –

Trả lời

76

Giả sử bạn có ba điều khiển xem instantiated như vậy:

UIViewController* vc1 = [[UIViewController alloc] init]; 
UIViewController* vc2 = [[UIViewController alloc] init]; 
UIViewController* vc3 = [[UIViewController alloc] init]; 

Bạn đã thêm chúng vào một thanh tab như thế này :

UITabBarController* tabBarController = [[UITabBarController alloc] init]; 
[tabBarController setViewControllers:[NSArray arrayWithObjects:vc1, vc2, vc3, nil]]; 

Bây giờ bạn đang cố gắng làm một cái gì đó như thế này:

[tabBarController presentModalViewController:vc3]; 

Điều này sẽ cho bạn một lỗi vì điều khiển thanh tab đó có một cái kẹp chết trên bộ điều khiển xem mà bạn đã cho nó. Bạn có thể không thêm nó vào mảng của bộ điều khiển xem trên thanh tab, hoặc bạn không thể trình bày nó một cách bình thường.

Apple hy vọng bạn xử lý các yếu tố giao diện người dùng của họ theo một cách nhất định. Điều này có thể được chôn trong Hướng dẫn Giao diện Con người ở đâu đó như là một "không làm điều này bởi vì chúng tôi không mong đợi bạn bao giờ muốn làm điều này".

+6

Điều này là hoàn toàn không có vấn đề trước khi iOS 5, do đó mối quan tâm của tôi! Những gì tôi đã làm là thêm một UIViewController giả vào thanh tabbar và hiện tại một cách khiêm tốn ví dụ lớp con của trình điều khiển xem thực tế. –

+0

@Iswank Cảm ơn. Bạn tiết kiệm thời gian của tôi! – CReaTuS

+1

@Iswank, hiện tại trong iOS 6, để làm mọi thứ "dễ dàng hơn", họ không dùng nữa presentModalViewController gây ra tất cả các loại vấn đề quay ... bạn cần sử dụng presentViewController: hoạt ảnh: hoàn thành và kiểm tra cách ứng dụng của bạn đang xử lý các thay đổi – whyoz

0

Chỉ cần loại bỏ

[tabBarController presentModalViewController:viewController animated:YES]; 

và giữ

[self dismissModalViewControllerAnimated:YES]; 
+0

cảnh báo ... vậy xen kẽ này là gì? –

+0

Ở đây tôi đã sử dụng [blockSelf dismissViewControllerAnimated: YES completion: nil]; –

11

Tôi có cùng một vấn đề. Tôi cố gắng trình bày bộ điều khiển xem ngay sau khi loại bỏ.

[self dismissModalViewControllerAnimated:YES]; 

Khi tôi cố gắng làm điều đó mà không có hoạt ảnh, nó hoạt động hoàn hảo để vấn đề là bộ điều khiển vẫn còn hoạt động. Tôi nghĩ rằng giải pháp tốt nhất là sử dụng dismissViewControllerAnimated:completion: cho iOS5

+0

Nó không thành công nếu bạn loại bỏ nó hoạt hình bởi vì thời gian bạn muốn trình bày các bộ điều khiển xem phương thức một lần nữa, nó vẫn còn modally trên màn hình, được hoạt hình đi. – Pascal

+2

Nó được depricated trong IOS 6.0 –

2

Tôi đã gặp sự cố tương tự. Tôi giải quyết vấn đề này.Bạn có thể thử Mã này:

[tabBarController setSelectedIndex:1]; 
[self dismissModalViewControllerAnimated:YES]; 
Các vấn đề liên quan