2011-12-15 29 views
15

Tôi có UIWebView tôi đang sử dụng để hiển thị một số tệp PDF nhỏ. Người dùng chọn một bài báo từ một bảng và sau đó bài viết (PDF) được tải trong một UIWebView trên cùng một màn hình. Việc tải đầu tiên luôn luôn đi tốt. Sau đó, mục tiếp theo tôi chọn (không có vấn đề cái nào) sẽ treo ứng dụng.UIWebView gặp sự cố với yêu cầu tải pdf thứ hai

Đây là cách tôi tải mỗi bài viết:

NSString *filePath = [[NSBundle mainBundle] pathForResource:articleFileName ofType:@"pdf"]; 
[articleView stopLoading]; 
[articleView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:filePath]]]; 

Vụ tai nạn xảy ra sau khi dòng loadRequest.
Tai nạn không có thông tin lỗi. Khác với:.

Tất cả các trường hợp ngoại lệ {} 0x3629f000

Catchpoint 3 (ngoại lệ ném) (gdb)

Nó chỉ bị treo to main(). Tôi đã xác minh trong trình gỡ lỗi rằng nó đang sử dụng đường dẫn tệp chính xác trên mỗi yêu cầu.

Tôi có NSZombies đang chạy và tôi đã đặt các điểm ngắt cho tất cả các ngoại lệ.

+0

Đại biểu xem web có thay đổi không? – amattn

+0

Các đại biểu là tự (có dây thông qua IB) không bao giờ thay đổi. – Dancreek

+0

Phương thức nào trong số 4 phương thức đại biểu được gọi trước khi xảy ra sự cố? – amattn

Trả lời

34

Tôi cũng gặp sự cố chính xác này. Cảm ơn Steve vì đã giúp tôi thu hẹp nó hơn nữa, ngoại lệ của tôi cũng giống như anh ấy.

Bạn có vi phạm tất cả ngoại lệ được đặt không? Tôi thấy rằng nếu tôi vô hiệu hóa điểm ngắt đó, nó sẽ không sụp đổ nữa. Mà tôi đã nghĩ rằng nó chỉ là một số lỗi trong trình gỡ lỗi mới hoặc phiên bản iOS? Điều khác khiến tôi nghĩ rằng sự cố này không xảy ra khi tôi chạy trên thiết bị có iOS 4.3.x hoặc trình mô phỏng 4.3.

+5

Vô hiệu hóa điểm ngắt "Break on all Exceptions" đã giải quyết được sự cố của tôi, sự cố sắp xảy ra sau UIWebPDFView _removeBackgroundImageObserverNếu được lưu trong stacktrace. Ai sẽ nghĩ rằng một breakpoint sẽ gây ra một vụ tai nạn? – ransomweaver

+4

Tôi thấy rằng bạn chỉ có thể tiếp tục trong trình gỡ lỗi sau khi nhấn điểm ngắt. Có thể có một ngoại lệ bị bắt và xử lý trong mã của Apple, vì vậy ngay cả khi ngoại lệ kích hoạt điểm ngắt, nó cũng không dẫn đến sự cố. –

+1

"Lỗi" này khiến tôi phát điên. Rất biết ơn câu trả lời. –

9

Tôi nhìn thấy một cái gì đó tương tự - cả khi giải phóng một lần xem web sau khi tải tệp PDF hoặc trong khi tải html sau khi tải tệp PDF. Nó có vẻ là rdar: // 10431759 (xem http://openradar.appspot.com/10431759). Tôi không có cách nào để giải quyết nó. Tôi có thể tái tạo nó bằng cách tải một pdf và sau đó tải chuỗi html @"<div></div>", do đó, nó không xuất hiện để được một vấn đề đại biểu.

Nếu bạn gõ "BT" vào gdb giao diện điều khiển, bạn có thể nhận stacktrace sản, bao gồm:

#0 0x37ccd1c8 in objc_exception_throw() 
#1 0x381817b8 in +[NSException raise:format:arguments:]() 
#2 0x381817b8 in +[NSException raise:format:arguments:]() 
#3 0x381817da in +[NSException raise:format:]() 
#4 0x35462628 in -[NSObject(NSKeyValueObserverRegistration) _removeObserver:forProperty:]() 
#5 0x35462296 in -[NSObject(NSKeyValueObserverRegistration) removeObserver:forKeyPath:]() 
#6 0x31fc3448 in -[UIWebPDFView _removeBackgroundImageObserverIfNeeded:]() 
#7 0x31fc36a8 in -[UIWebPDFView dealloc]() 
#8 0x37cc90c4 in _objc_rootRelease() 
#9 0x31dd2614 in -[UIWebPDFViewHandler clearAllViews]() 
#10 0x31d76708 in -[UIWebPDFViewHandler _replacePDFViewIfPresentWithWebDocView:]() 
#11 0x31d766a6 in -[UIWebPDFViewHandler _removePDFViewIfWebDocViewIsNotPDF:]() 
#12 0x31d76644 in -[UIWebBrowserView webView:didFirstVisuallyNonEmptyLayoutInFrame:]() 

Khi gỡ lỗi trên thiết bị, bạn có thể gõ "khung 0" và "po $ r0" để xem thông điệp ngoại lệ: (tôi nghĩ rằng đó là "po $ eax" trong mô phỏng.)

(gdb) frame 0 
#0 0x37ccd1c8 in objc_exception_throw() 
(gdb) po $r0 
Cannot remove an observer <UIWebPDFView 0x4a3200> for the key path "backgroundImage" from <UIPDFPageView 0x4a4bf0> because it is not registered as an observer. 

Edit: vấn đề này dường như chỉ xảy ra khi tôi có "break trên ném" bật cho Objective- C ngoại lệ.

0

Tôi gặp sự cố tương tự, với treo UIWebView của mình (chỉ đóng băng ở màn hình màu xám có vòng tròn "tải" đang quay mà không bao giờ kết thúc). Nếu tôi thoát khỏi chương trình, nó sẽ làm cho nó sụp đổ lần thứ hai tôi nạp.

Cuối cùng, tôi đã tìm đủ dữ liệu và tôi thấy rằng nếu tôi tải phông chữ nhãn (với số CCLabelTTF sử dụng Cocos2d) từ gói tài nguyên ứng dụng trước, THEN đã cố gắng tải tệp PDF, sau đó nó sẽ hoạt động và sẽ không sụp đổ.

Đó là một hack rất xấu, nhưng ai đó có thể thấy nó hữu ích.

// HACK: Loading a TTF font first is needed to properly load PDF/HTML 
CCLabelTTF* label = [CCLabelTTF labelWithString:@"Testing" fontName:@"DIN-Black" fontSize:12]; 
[label setVisible:false]; 

// We never actually use the label -- we just create it so that it loads the font 
NSString *path = [[NSBundle mainBundle] 
        pathForResource:myPDF 
        ofType:@"pdf"]; 

CCLOG(@"Retrieving PDF from '%@'", path); 

NSURL *pdfUrl = [NSURL fileURLWithPath:path]; 
NSURLRequest *request = [NSURLRequest requestWithURL:pdfUrl]; 

[webView loadRequest:request]; 
[webView setScalesPageToFit:YES]; 
[super onEnter]; 
Các vấn đề liên quan