2011-10-02 8 views
7

WebView tiene un método llamado¿Cómo permitir la carga de archivos con WebView en Cocoa?

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

Pero no hay casi 0 doc y detalles sobre el mismo. En el interior, muestro un cuadro de diálogo de archivo abierto y obtengo el nombre del archivo seleccionado.

gusta esta

- (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]; 
    } 

} 

Pero entonces?

¿Qué debo hacer? En el sitio web, muestra que seleccioné un archivo, pero cuando haces clic en cargar el sitio web solo devuelves un error, como si no se carga ningún archivo. ¿Debo escribir el código que maneja la carga del archivo o qué?

Estoy un poco perdido ...

Editar:

De hecho, yo tengo trabajo .... Con sólo modificar el código de aquí: Cocoa webkit: how to get file upload/file system access in webkit un poco, ya que una parte está desfasada

- (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]; 
    } 

} 

disfrutar!

+0

¿Cuál es el idioma que está utilizando? –

+0

Objetivo-c, pero lo tengo trabajando ahora – Dimillian

+0

luego borre su pregunta ... –

Respuesta

8

que siguieron comentario Peter Hosey y wow, ahora mi código es corto y funciona de la misma

- (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, este método no se llama para mí – jkk

+0

@jkk y cualquier otra persona con este problema, es necesario conectar la vista al 'UIDelegate'; de lo contrario, no se invocará la función. –

2

Hay un par de maneras en que su código se puede mejorar:

  • Para bucle a través de una matriz, en lugar de utilizar fast enumeration un bucle índice. Es más rápido y fácil de leer. La única vez que debe usar un ciclo de índice es cuando realmente necesita índices, y esta no es una situación tal.
  • No necesita el primer ciclo. Envíe la matriz de URL un mensaje valueForKey:, con @"relativePath" para la clave. La matriz le preguntará a cada objeto (cada URL) por su relativePath, recolectará una matriz de todos los resultados y la devolverá por usted. El código para esto es de una sola línea.
  • No necesita el segundo bucle, tampoco. El protocolo WebOpenPanelResultListener agregó chooseFilenames: en 10.6, por lo que ahora puede enviar ese mensaje, una vez, pasando toda la matriz a él.
+0

Muchas gracias, realmente necesito para aprender a usar el verdadero poder de Objective-C – Dimillian

Cuestiones relacionadas