2011-10-02 9 views
7

WebView ha un metodo chiamatoCome consentire il caricamento di file con WebView in Cocoa?

- (void)webView:(WebView *)sender runOpenPanelForFileButtonWithResultListener:(id <WebOpenPanelResultListener>)resultListener 

Ma non v'è quasi 0 doc e dettagli su di esso. All'interno di I mostra una finestra di dialogo di file aperti e ottieni il nome del file selezionato.

Ti piace questa

- (void)webView:(WebView *)sender runOpenPanelForFileButtonWithResultListener:(id <WebOpenPanelResultListener>)resultListener 
{  
    NSOpenPanel* openDlg = [NSOpenPanel openPanel]; 

    [openDlg setCanChooseFiles:YES]; 

    [openDlg setCanChooseDirectories:NO]; 

    // process the files. 
    if ([openDlg runModal] == NSOKButton) 
    { 
     NSString* fileString = [[openDlg URL]absoluteString]; 
     [resultListener chooseFilename:fileString]; 
    } 

} 

Ma poi?

Cosa devo fare? Sul sito web, mostra che ho selezionato un file, ma quando si fa clic su caricare il sito web è sufficiente restituire un errore, come se nessun file è stato caricato. Dovrei scrivere il codice che gestisce il caricamento del file o cosa?

Sono un po 'perso ...

Edit:

In effetti ho ottenuto che funziona .... Con solo modificare il codice da qui: Cocoa webkit: how to get file upload/file system access in webkit un po', come una certa parte è stata sconsigliata

- (void)webView:(WebView *)sender runOpenPanelForFileButtonWithResultListener:(id <WebOpenPanelResultListener>)resultListener 
{  
    // Create the File Open Dialog class. 
    NSOpenPanel* openDlg = [NSOpenPanel openPanel]; 

    // Enable the selection of files in the dialog. 
    [openDlg setCanChooseFiles:YES]; 

    // Enable the selection of directories in the dialog. 
    [openDlg setCanChooseDirectories:NO]; 

    if ([openDlg runModal] == NSOKButton) 
    { 
     NSArray* URLs = [openDlg URLs]; 
     NSMutableArray *files = [[NSMutableArray alloc]init]; 
     for (int i = 0; i <[URLs count]; i++) { 
      NSString *filename = [[URLs objectAtIndex:i]relativePath]; 
      [files addObject:filename]; 
     } 

     for(int i = 0; i < [files count]; i++) 
     { 
      NSString* fileName = [files objectAtIndex:i]; 
      [resultListener chooseFilename:fileName]; 
     } 
     [files release]; 
    } 

} 

Divertiti!

+0

Qual è la lingua che si sta utilizzando? –

+0

Objective-c, ma ho funzionato ora – Dimillian

+0

quindi elimina la tua domanda .. –

risposta

8

ho seguito Peter Hosey commento e wow, il mio codice è ora breve e funziona allo stesso

- (void)webView:(WebView *)sender runOpenPanelForFileButtonWithResultListener:(id <WebOpenPanelResultListener>)resultListener 
{  
    // Create the File Open Dialog class. 
    NSOpenPanel* openDlg = [NSOpenPanel openPanel]; 

    // Enable the selection of files in the dialog. 
    [openDlg setCanChooseFiles:YES]; 

    // Enable the selection of directories in the dialog. 
    [openDlg setCanChooseDirectories:NO]; 

    if ([openDlg runModal] == NSOKButton) 
    { 
     NSArray* files = [[openDlg URLs]valueForKey:@"relativePath"]; 
     [resultListener chooseFilenames:files]; 
    } 

} 
+0

runOpenPanelForFileButtonWithResultListener, questo metodo non chiamato per me – jkk

+0

@jkk e chiunque altro con questo problema, è necessario collegare la vista su 'UIDelegate', altrimenti la funzione non verrà chiamata. –

2

ci sono un paio di modi il codice può essere migliorato:

  • Per scorrere un array, utilizzare fast enumeration invece di un ciclo di indice. È più veloce e facile da leggere. L'unica volta che dovresti usare un ciclo di indice è quando hai davvero bisogno di indici, e questa non è una situazione del genere.
  • Non è necessario il primo ciclo. Invia l'array di URL un messaggio valueForKey:, con @"relativePath" per la chiave. L'array chiederà ad ogni oggetto (ogni URL) il suo relativePath, raccogliere un array di tutti i risultati e restituirlo per te. Il codice per questo è un one-liner.
  • Non è necessario neanche il secondo ciclo. Il protocollo WebOpenPanelResultListener ha aggiunto chooseFilenames: in 10.6, quindi ora puoi inviare quel messaggio, una volta, passandogli l'intero array.
+0

Grazie mille, ho davvero bisogno di imparare ad usare il vero potere di Objective-C – Dimillian

Problemi correlati