2011-10-02 4 views
7

WebView ont une méthode appeléeComment autoriser le téléchargement de fichiers avec WebView dans Cocoa?

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

Mais il y a presque 0 doc et détails à ce sujet. À l'intérieur, j'affiche une boîte de dialogue ouverte et obtient le nom du fichier sélectionné.

Vous aimez cette

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

} 

Mais alors?

Que dois-je faire? Sur le site, il montre que j'ai sélectionné un fichier, mais lorsque vous cliquez sur télécharger le site, il suffit de retourner une erreur, comme si aucun fichier n'est téléchargé. Dois-je écrire le code qui gère le téléchargement de fichier ou quoi?

Je suis un peu perdu ...

Edit:

En fait, je l'ai eu de travail .... En modifier simplement le code d'ici: Cocoa webkit: how to get file upload/file system access in webkit un peu, comme une partie a été dépréciée

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

} 

Profitez-en!

+0

Quelle est la langue que vous utilisez? –

+0

Objective-c, mais je l'ai fait fonctionner maintenant – Dimillian

+0

puis supprimez votre question .. –

Répondre

8

J'ai suivi un commentaire Peter Hosey et wow, mon code est maintenant court et fonctionne de la même

- (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, cette méthode n'appelé pour moi – jkk

+0

@jkk et toute autre personne avec ce problème, vous devez vous connecter la vue à 'UIDelegate', sinon la fonction ne sera pas appelée. –

2

Il y a deux façons votre code peut être amélioré:

  • à boucle à travers un tableau, utilisez fast enumeration au lieu d'une boucle d'index. C'est à la fois plus rapide et plus facile à lire. La seule fois où vous devriez utiliser une boucle d'index est quand vous avez vraiment besoin d'index, et ce n'est pas une telle situation.
  • Vous n'avez pas du tout besoin de la première boucle. Envoyer le tableau d'URL un message valueForKey:, avec @"relativePath" pour la clé. Le tableau demandera à chaque objet (chaque URL) relativePath, de recueillir un tableau de tous les résultats, et le retourner pour vous. Le code pour ceci est un one-liner.
  • Vous n'avez pas non plus besoin de la deuxième boucle. Le protocole WebOpenPanelResultListener a ajouté chooseFilenames: dans 10.6, vous pouvez donc envoyer ce message, une fois, en lui passant tout le tableau.
+0

Merci beaucoup, je vraiment besoin d'apprendre à utiliser la vraie puissance de l'Objective-C – Dimillian

Questions connexes