2011-01-11 21 views
11
When I try to click the menu action button in QLPreviewController the application crashes. 

Đây là những gì tôi đang làm trong phương pháp đại biểutreo ứng dụng iPhone- trên bấm vào nút hành động đơn trong QLPreviewController iOS 4.2

- (id)previewController:(QLPreviewController *)previewController previewItemAtIndex:(NSInteger)index 
{ 

    NSMutableString*Url = [[NSMutableString alloc] initWithFormat:@"http://10.30.24.21/Documents/abc.doc]; 

    NSURL *fileURL; 
    fileURL = [NSURL URLWithString:Url];// the url of the file which is present in NAS device 
    [Url release]; 
    return fileURL; 
} 

Đây là báo cáo tai nạn

2011-01-11 12:21:36.717 iLink[5548:207] *** Assertion failure in -[UIDocumentInteractionController setURL:], /SourceCache/UIKit_Sim/UIKit-1447.6.4/UIDocumentInteractionController.m:1060 
2011-01-11 12:21:36.720 iLink[5548:207] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UIDocumentInteractionController: invalid scheme https. Only the file scheme is supported.' 

Khi Tôi cố gắng để xem trước tập tin hiện tại trình đơn nút bấm hành động địa phương là không bị rơi.

đó tôi sẽ được sử dụng

NSURL *fileURL; 
    fileURL = [NSURL fileURLWithPath:filePath];// filePath is local file path. 

tôi hiểu rằng khi chúng ta xem trước tập tin địa phương ([NSURL fileURLWithPath: filepath]) trình đơn hành động nút bấm không đâm ,, khi chúng ta xem trước tập tin từ máy chủ ([ NSURL URLWithString: Url]) nút hành động nhấp chuột vào menu.

Tôi có hai câu hỏi, 1. Chúng tôi có thể tắt nút tác vụ trình đơn không? 2. Có cách nào để tránh sự cố bằng cách sử dụng [URL của NSURLWithString: Url] không?

Cảm ơn

Trả lời

2

Có cách nào để tránh những tai nạn sử dụng [NSURL URLWithString: Url]?

Tải tệp xuống hệ thống tệp cục bộ của bạn trước tiên.

+0

mục tiêu ứng dụng của không phải là để tải về tập tin. nó chỉ để xem trước các tập tin có mặt trong thiết bị NAS sử dụng URL. –

+0

bạn không thể xem trước tệp mà không tìm nạp tệp từ máy chủ. Ít nhất là không nếu bạn muốn sử dụng UIDocumentInteractionController. Bộ điều khiển cần tệp trên hệ thống tệp cục bộ để hoạt động. –

+0

Xem trước không phải là vấn đề đối với tôi ngay cả khi tôi sử dụng [NSURL URLWithString: Url] Tôi có thể xem các tệp. Nó chỉ là ứng dụng treo khi tôi nhấp vào nút hành động menu .. U có thể cho tôi bất kỳ giải pháp để ứng dụng không sụp đổ. Tôi có thể xử lý nút bấm hành động menu đó không? –

34

Cần sử dụng

[NSURL fileURLWithPath:urPath] 
+0

Câu trả lời này là câu trả lời đúng. –

0

Bằng cách tuyên bố của bạn
NSMutableString*Url = [[NSMutableString alloc] initWithFormat:@"http://10.30.24.21/Documents/abc.doc]; có một typo-lỗi. Bạn bỏ lỡ một "để chỉ sự kết thúc của chuỗi url

8

Trong khi câu trả lời trước đã đưa ra những phản ứng kỹ thuật đúng, tôi muốn xây dựng nhiều hơn nữa.

Các tài liệu API cho QLPreviewItem nói rằng URL phải là một file-nhập URL, mà NSURL docs nói có nghĩa là "sử dụng các chương trình file:".

bạn cũng có thể đọc thêm một chút từ hướng dẫn Document Interaction Progamming đó đề cập rằng QuickLook là nghĩa vụ phải cung cấp cho bạn kiểm soát nhiều hơn một UIDocumentInteractionController bằng cách cho bạn quyết định cách nó được trình bày, nhưng nó mang lại với nó cùng một giả định rằng bạn đã có một tệp cục bộ và bạn chỉ muốn một cách để hiển thị nó và (với QuickLook) in nó bằng AirPrint.

Trong trường hợp của bạn, có thể có ý nghĩa nhất khi tải tệp xuống thư mục Caches của ứng dụng, sau đó mở xem trước QL - nó đã được tải xuống chế độ xem trước anyway, vì vậy bạn cũng có thể lấy nó rằng nó có thể được in quá.

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); 
// Here you'll _probably_ want to use a filename that's got the correct extension...but YMMV 
NSURL *cacheURL = [NSURL fileURLWithPath:[[paths objectAtIndex:0] stringByAppendingPathComponent: @"current.pdf"]]; 

Bây giờ lấy URL ban đầu của bạn và tải xuống nội dung và lưu chúng tại cacheURL.Nếu bạn sử dụng ASIHTTPRequest, nó trông như thế này:

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:originalURL]; 
[request setDownloadDestinationPath:[cacheURL path]]; 
// Yup. You could optimize here if needed... 
[request startSynchronous]; 

Và sau đó bạn sử dụng URL tập tin theo quan điểm QuickLook của bạn ...

- (id)previewController:(QLPreviewController *)previewController previewItemAtIndex:(NSInteger)index { 
    // Assuming you've saved this somewhere, etc... 
    return self.cacheURL; 
} 

Trong kịch bản này, mỗi PDF mới mà bạn nhìn vào từ NAS ghi đè tên trước đó (cùng tên, cùng thư mục), vì vậy bạn giới hạn mức sử dụng đĩa của mình. Rõ ràng, có rất nhiều cách để xử lý vấn đề đó, vì vậy hãy chọn một cách phù hợp với bạn. Chìa khóa, tuy nhiên, là để tải tập tin tại địa phương và giữ nó xung quanh ít nhất là cho đến khi xem QL được miễn nhiệm.

0

Tôi có thể hiển thị tệp PDF bằng cách sử dụng lược đồ HTTP. Ứng dụng đổ vỡ khi người dùng nhấn nút in. Vì vậy, tôi cần một cách chỉ để hiển thị PDF qua HTTP và như là một hình phạt cần thiết để vô hiệu hóa nút in. Vô hiệu hóa các nút trong một lớp con trong viewDidAppear Đây là mã của tôi

@interface PreviewController : QLPreviewController 
@end 

@implementation PreviewController 
-(void) viewDidAppear:(BOOL)animated { 
    self.navigationItem.rightBarButtonItem = nil; 
} 
@end 

và sử dụng như mã:

// use the new class 
QLPreviewController *previewController = [[PreviewController alloc] init]; 
previewController.delegate = self; 
previewController.dataSource = self; 
[self.navigationController pushViewController:previewController animated:FALSE]; 
Các vấn đề liên quan