“Ứng dụng đã cố gắng trình bày theo phương thức một bộ điều khiển hoạt động”?


100

Tôi vừa gặp sự cố hiển thị một NSInvalidArgumentExceptionthông báo 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 theo phương thức một bộ điều khiển hoạt động UITabBarController: 0x83d7f00.

Tôi có một UITabBarControllercái mà tôi tạo trong AppDelegatevà cung cấp cho nó mảng UIViewControllers.

Một trong số chúng tôi muốn trình bày một cách tiết chế khi chạm vào nó. Tôi đã làm điều đó bằng cách triển khai phương thức ủy quyền

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

Nếu bộ điều khiển chế độ xem đó thuộc loại mà tôi muốn trình bày theo phương thức, tôi trả về KHÔNG và thực hiện

[tabBarController presentModalViewController:viewController animated:YES];

Và bây giờ tôi nhận được lỗi đó, có vẻ như có nghĩa là bạn không thể trình bày theo phương thức một bộ điều khiển chế độ xem đang hoạt động ở một nơi khác (trong thanh tab ...) 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ĩ rằng tôi không đưa ra bất kỳ chi tiết bị cấm nào). Tôi hiện không có bản cài đặt XCode để kiểm tra xem điều này có gặp sự cố khi biên dịch với iOS4 SDK hay không, nhưng tôi gần như hoàn toàn chắc chắn rằng không.

Tôi chỉ muốn hỏi nếu có ai đã gặp vấn đề này hoặc có bất kỳ đề xuất nào


Trước iOS 5, điều này không tạo ra ngoại lệ, nhưng không trả lại gì. Từ iOS 5 trở đi, lệnh này đưa ra một ngoại lệ.
Frédéric Adda

Câu trả lời:


103

Giả sử bạn có ba bộ điều khiển chế độ xem được khởi tạo 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 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 điều gì đó như sau:

[tabBarController presentModalViewController:vc3];

Điều này sẽ gây ra lỗi cho bạn vì Bộ điều khiển thanh tab đó đã cố định bộ điều khiển chế độ xem mà bạn đã cung cấp. Bạn có thể không thêm nó vào mảng bộ điều khiển chế độ xem trên thanh tab hoặc bạn không thể trình bày nó theo cách thức.

Apple mong đợi 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ó lẽ được chôn giấu trong Nguyên tắc giao diện con người ở đâu đó như là "không làm điều này vì chúng tôi không mong đợi bạn sẽ muốn làm điều này".


6
Vấn đề là điều này hoàn toàn không có vấn đề gì trước iOS 5, do đó tôi rất lo lắng! Những gì tôi đã làm là thêm một UIViewController giả vào thanh tab và trình bày theo phương thức phiên bản lớp con của bộ điều khiển chế độ xem thực tế.
Javier Soto

1
@Iswank, hiện đã có trong iOS 6, để làm cho mọi thứ "dễ dàng hơn", họ đã ngừng sử dụng presentModalViewController gây ra tất cả các loại sự cố xoay ... bạn cần sử dụng presentViewController: animation: hoàn thành và kiểm tra cách ứng dụng của bạn xử lý các thay đổi
whyoz

15

Tôi có cùng một vấn đề. Tôi cố gắng trình bày bộ điều khiển chế độ 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 nên vấn đề là bộ điều khiển vẫn còn sống. Tôi nghĩ rằng giải pháp tốt nhất là sử dụng dismissViewControllerAnimated:completion:cho iOS5


Sẽ không thành công nếu bạn loại bỏ nó hoạt ảnh vì vào thời điểm bạn muốn trình bày lại bộ điều khiển chế độ xem, nó vẫn ở chế độ trên màn hình, đang được hoạt ảnh đi.
Pascal

2
Nó được mô tả trong IOS 6.0
Sumit Kumar Saha

12

Trong trường hợp của tôi, tôi đang cố gắng trình bày viewController (tôi có tham chiếu của viewController trong TabBarViewController) từ các bộ điều khiển chế độ xem khác nhau và nó đã gặp sự cố với thông báo trên. Trong trường hợp đó để tránh trình bày, bạn có thể sử dụng

viewController.isBeingPresented

!viewController.isBeingPresented {
          // Present your ViewController only if its not present to the user currently.
}

Có thể giúp ai đó.


nó chỉ hoạt động trong viewWillappperar nhưng khi tôi đã kiểm tra nó trước khi trình bày viewController đã được trình bày, nó luôn trả về false.
guru

1
Không làm việc cho tôi. Vẫn bị lỗi ứng dụng. (! viewController.presentingViewController) đã giải quyết vấn đề.
Argus

3

Tôi đã có cùng một vấn đề. Tôi giải quyết nó. Bạn có thể thử Mã này:

[tabBarController setSelectedIndex:1];
[self dismissModalViewControllerAnimated:YES];

2

Lỗi sự cố tương tự đã xảy ra với tôi khi tôi cố gắng presentđiều khiển chế độ xem con thay vì bộ điều khiển chế độ xem UINavigationViewControllermẹ của nó


0

Chỉ cần loại bỏ

[tabBarController presentModalViewController:viewController animated:YES];

và giữ

[self dismissModalViewControllerAnimated:YES];

điều này đưa ra cảnh báo không được dùng nữa ... vậy thay thế của điều này là gì?
Kirtikumar A.

Ở đây tôi đã sử dụng [blockSelf allowViewControllerAnimated: YES complete: nil];
Kirtikumar A.

0

Thay vì sử dụng:

self.present(viewControllerToPresent: UIViewController, animated: Bool, completion: (() -> Void)?)

bạn có thể dùng:

self.navigationController?.pushViewController(viewController: UIViewController, animated: Bool)

0

Trong trường hợp của tôi, tôi đã trình bày rootViewControllermột UINavigationControllerkhi tôi được cho là trình bày UINavigationControllerchính nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.