2010-03-25 2 views
11

Es sieht aus wie ein paar Leute auf stackoverflow bekommen dies zu arbeiten, aber ihr Code ist nicht veröffentlicht. Ich verwendeAnzeigen von PPT, doc und xls in UIWebView funktioniert nicht, aber pdf tut

[web loadData:data MIMEType:MIMEType textEncodingName:@"UTF-8" baseURL:nil]; 

wo Mimetype ist:

  • @ "application/vnd.ms-Powerpoint"
  • @ "application/vnd.ms-Wort"
  • @ "-Anwendung /vnd.ms-excel“

(BTW, ich habe DOC gesehen Dateien MIME-Typ verwenden @ "application/msword", sondern die "VND" -Version scheint besser geeignet. ich habe gerade versucht, sowohl für den Fall.)

Ich habe überprüft, dass meine 'Daten' korrekt sind. PDF- und TXT-Dateien funktionieren. Wenn das UIWebView PPT-, DOC- oder XLS-Dateien anzeigt, ist es leer. Ich habe NSLOG-Anweisungen in meine UIWebViewDelegate-Aufrufe eingefügt.

shouldStartLoadWithRequest:<NSMutableURLRequest about:blank> navType:5 
    webViewDidStartLoad: 
    didFailLoadWithError:Error Domain=NSURLErrorDomain Code=100 UserInfo=0x122503a0 "Operation could not be completed. (NSURLErrorDomain error 100.)" 
    didFailLoadWithError:Error Domain=WebKitErrorDomain Code=102 UserInfo=0x12253840 "Frame load interrupted" 

so offensichtlich die Last versagt, aber warum? Wenn ich meinen MIME-Typ für eine PPT-Datei in @ "text/plain" ändere, lädt das UIWebView ordnungsgemäß und zeigt nicht druckbare Zeichen wie erwartet an. Das sagt mir die 'Daten', die an loadData übergeben werden: ist in Ordnung.

Bedeutung meine Mimetypen sind schlecht?

Und nur um sicherzustellen, dass meine PPT, DOC und XLS-Dateien in der Tat in Ordnung sind, habe ich eine einfache HTML-Datei mit Anchor-Tags zu den Dateien erstellt. Wenn die HTML-Datei in Safari auf dem iPhone angezeigt wird, wird das Klicken auf die Dateien in Safari korrekt angezeigt.

Ich habe versucht, den in didFailLoadWithError (100) angezeigten Fehlercode zu recherchieren, aber alle dokumentierten Fehlercodes sind negativ und größer als 1000 (wie in NSURLError.h zu sehen).

-(void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error { NSLog(@"didFailLoadWithError:%@", error); } 

Antwort

9

Haben Sie versucht, die folgende dokumentierte Methode ?:

-(void)loadDocument:(NSString*)documentName inView:(UIWebView*)webView 
{ 
    NSString *path = [[NSBundle mainBundle] pathForResource:documentName ofType:nil]; 
    NSURL *url = [NSURL fileURLWithPath:path]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
    [webView loadRequest:request]; 
} 

// Calling -loadDocument:inView: 

[self loadDocument:@"mydocument.rtfd.zip" inView:self.myWebview]; 

Es funktioniert für diese in iPhone OS 2.2.1 mit: Excel (.xls) Keynote (.key.zip) Numbers (.numbers.zip) Seiten (.pages.zip) PDF (.pdf) Powerpoint (PPT) Word (.doc)

iPhone OS 3.0 sup Häfen diese zusätzlichen Dokumenttypen: Rich Text Format (.rtf) Rich Text Format Directory (.rtfd.zip) Keynote '09 (.key) Numbers '09 (.numbers) Pages '09 (.pages)

+0

Ja, ich habe loadRequest verwendet und das funktioniert gut, wenn ich die Anhangsdatei als Teil meines Projekts habe. Ich habe das nur zum Testen gemacht, um sicherzustellen, dass meine Dateien in Ordnung waren. In meiner realen Anwendung wird die Datei jedoch von einem Server heruntergeladen, und alles, was ich habe, ist NSData. – slugolicious

+0

Kann nicht verwendet werden NSURL * url = [NSURL fileURLWithPath: Pfad]; und NSURLRequest * Anfrage = [NSURLRequest requestWithURL: URL]; von Ihrem Server herunterladen? Ich kann. Gibt es einen Grund, warum Sie die URL der Datei nicht auf Ihrem Server laden können? –

+0

Diese Methode funktioniert gut, Prost !!! – AdamM

7

Die einzige Möglichkeit, ein Office-Objekt zu lesen (getestet mit .doc oder .xls) ist, das NSData-Objekt in einer temporären Datei zu speichern und dann zu lesen.

-(void)openFileUsingExtension:(NSString*)extension { 
    NSString *path = [NSString stringWithFormat:@"%@temp.%@",NSTemporaryDirectory(),extension]; 
    NSLog(@"%@",path); 

    if ([objectFromNSData writeToFile:path atomically:YES]) { 
     NSLog(@"written"); 

     NSURL *url = [NSURL fileURLWithPath:path]; 
     NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
     [self.webview loadRequest:request]; 
     self.webview.scalesPageToFit = YES; 
     self.webview.delegate = self; 
     [self.view addSubview:self.webview]; 
    } 
} 

dann können Sie die Datei in der UIWebViewDelegate Methode entfernen:

- (void)webViewDidFinishLoad:(UIWebView *)webView{ 
    NSString *path = [NSString stringWithFormat:@"%@temp.%@",NSTemporaryDirectory(),extension]; 
    [[NSFileManager defaultManager] removeItemAtPath:path error:nil]; 
} 
+0

Das funktioniert am besten für mich! – MobileMon

2

Haben Sie versucht, diese auf dem Gerät oder im Simulator nur?

Ich finde, dass ich UIWebView nicht erreichen kann, um .doc- und .pages-Dokumente im Simulator anzuzeigen (aber .txt und .pdf anzeigen), aber beide Dateitypen laden und anzeigen gut auf dem iPad und iPhone-Geräten .

Fehler im Simulator?

Gregor, Schweden

3
UIWebView *webView = [[UIWebView alloc]initWithFrame:CGRectMake(0.0, 0.0, 1000, 760)]; 
[webView setScalesPageToFit:YES]; 
webView.backgroundColor=[UIColor clearColor]; 
NSString *ppt = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"ppt"]; 
NSURL *pptURL = [NSURL fileURLWithPath:ppt]; 
NSURLRequest *request = [NSURLRequest requestWithURL:pptURL]; 
[webView loadRequest:request]; 
[self.view addSubview:webView]; 
[webView release]; 
+0

Es funktioniert .. Danke – Muzammil

0

Nachdem durch die Suche, die Lösung, die ich fand, war, weil, wenn wir xls in Xcode per Drag importieren und die xls-Datei in Project- Drop> Unterstützung von Dateien, wir auf bestimmte müssen die "Zu Zielen hinzufügen:", müssen wir das Projekt ankreuzen, um hinzuzufügen