2014-10-01 17 views
7

Không thể tạo lại sự cố sau.Bắt gặp sự cố không thể tự thêm làm chế độ xem phụ trong ios

Tôi đã xử lý trường hợp: không phân biệt chế độ xem trong khi một chế độ xem đang hoạt ảnh. Vấn đề tương tự được đề cập ở đây: iOS app error - Can't add self as subview. Tôi đã triển khai giải pháp this để phân đoạn an toàn.

Tôi vẫn gặp sự cố sau.

Lưu ý: bị lỗi trên cả iOS 7 và 8 nhưng có nhiều sự cố xảy ra với iOS 8. (nếu điều đó có ích). Không nhận được sự cố trong trình mô phỏng ngay cả khi segueing từ viewDidLoad.

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Can't add self as subview' 

Application Specific Backtrace 1: 
0 CoreFoundation      0x24503f87 <redacted> + 126 
1 libobjc.A.dylib      0x31c62c77 _objc_exception_throw + 38 
2 CoreFoundation      0x24503ecd -[NSException initWithCoder:] + 0 
3 UIKit        0x279880b3 -[UIView _addSubview:positioned:relativeTo:] + 114 
4 UIKit        0x27988037 -[UIView addSubview:] + 30 
5 UIKit        0x27b4d491 <redacted> + 1236 
6 UIKit        0x2798e701 +[UIView performWithoutAnimation:] + 72 
7 UIKit        0x27b4cd79 -[_UINavigationParallaxTransition animateTransition:] + 808 
8 UIKit        0x27b0b787 -[UINavigationController _startCustomTransition:] + 2854 
9 UIKit        0x27a2ab2f -[UINavigationController _startDeferredTransitionIfNeeded:] + 422 
10 UIKit        0x27a2a931 -[UINavigationController __viewWillLayoutSubviews] + 44 
11 UIKit        0x27a2a8c9 -[UILayoutContainerView layoutSubviews] + 184 
12 UIKit        0x2797f25f -[UIView layoutSublayersOfLayer:] + 514 
13 QuartzCore       0x273aa1d5 -[CALayer layoutSublayers] + 136 
14 QuartzCore       0x273a5bd1 <redacted> + 360 
15 QuartzCore       0x273a5a59 <redacted> + 16 
16 QuartzCore       0x273a5447 <redacted> + 222 
17 QuartzCore       0x273a5251 <redacted> + 324 
18 UIKit        0x27980c31 <redacted> + 1384 
19 CoreFoundation      0x244ca807 <redacted> + 14 
20 CoreFoundation      0x244c9c1b <redacted> + 222 
21 CoreFoundation      0x244c8299 <redacted> + 768 
22 CoreFoundation      0x24415db1 _CFRunLoopRunSpecific + 476 
23 CoreFoundation      0x24415bc3 _CFRunLoopRunInMode + 106 
24 GraphicsServices     0x2b7a0051 _GSEventRunModal + 136 
25 UIKit        0x279e0f01 _UIApplicationMain + 1440 
+0

Điều này đôi khi xảy ra khi bạn gọi chuyển tiếp không đồng bộ. Có lẽ bạn đã đẩy cùng VC trên cùng một hành động từ bảng phân cảnh và từ mã? Hoặc bạn đang đẩy một số VC trước khi bạn bật khác? – jovanjovanovic

+0

Tôi đã sử dụng 'performSegueWithIdentifier:' cho tất cả segue và 'popToViewController: animated:' tại một nơi. Cần làm rõ về 'Hoặc bạn đang đẩy một số VC trước khi bạn bật khác?' – Pushparaj

+0

Chỉ cần thử tìm kiếm các chuyển tiếp lồng nhau. Phải có một số nơi mà bạn đang đẩy một số ViewController trước khi khác được popped ... Hoặc một nơi mà bạn đang đẩy một số ViewController trước khi quá trình chuyển đổi kết thúc. – jovanjovanovic

Trả lời

1

Xin lỗi vì đã đến muộn cho bữa tiệc. Gần đây tôi đã có vấn đề này trong đó thanh điều hướng của tôi đi vào trạng thái bị hỏng vì đẩy nhiều hơn một bộ điều khiển xem cùng một lúc. Điều này xảy ra vì bộ điều khiển chế độ xem khác được đẩy trong khi bộ điều khiển chế độ xem đầu tiên vẫn hoạt ảnh. Lấy gợi ý từ câu trả lời không tráng men từ here

Tôi đã đưa ra giải pháp đơn giản hoạt động trong trường hợp của mình. Bạn chỉ cần phân lớp UINavigationController và ghi đè lên phương thức pushViewController và kiểm tra xem hoạt ảnh của bộ điều khiển xem trước đó đã kết thúc chưa. Bạn có thể nghe phần hoàn thành hoạt ảnh bằng cách đặt lớp của bạn là đại biểu của UINavigationControllerDelegate và đặt đại biểu thành self.

Tôi đã tải lên gist here để làm mọi thứ đơn giản.

Chỉ cần đảm bảo bạn đã đặt lớp mới này làm NavigationController trong bảng phân cảnh của mình.

+0

Tôi đã triển khai giải pháp này như được đề cập trong câu hỏi (giải pháp: http: //stackoverflow.com/questions/22421845/ios-app-crash-on -multiple-segue-at-the-same-time-đi-tới-khác-segue-while-o/22928000 # 22928000). Tôi đã sử dụng cách tiếp cận này bởi vì 'pushViewController: animated:' sẽ không xử lý các trường hợp cho các phân đoạn tùy chỉnh như 'performSegueWithIdentifier:' – Pushparaj

+0

Bằng cách này, hiện tại tôi đã cập nhật một sdk của bên thứ ba đang sử dụng 'UINavigationController'.Cảm ơn bạn đã trả lời chi tiết. – Pushparaj

1

Điều này cũng xảy ra khi vì một số lý do bạn đẩy bộ điều khiển segue/viewcontroller nhiều lần. Một trong những trường hợp như vậy là khi bạn đang quan sát thông báo và nếu vì lý do nào đó thông báo được đăng nhiều lần và trong phương pháp quan sát, nếu bạn đang đẩy trình điều khiển chế độ xem, nó sẽ đẩy đến nhiều lần. của vụ tai nạn.

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