2011-04-15 11 views
5

Estoy usando NSOpenPanel para permitir que un usuario seleccione una carpeta para guardar documentos. Me gustaría restringir en qué carpeta (en términos de jerarquía) pueden guardar. En esencia, quiero evitar que la elección de cualquier carpeta anterior:Restrinja el acceso a ciertas carpetas usando NSOpenPanel

/Usuarios/nombre de usuario/

Así la carpeta

/Users/username/gatos/

sería aceptable pero

/Users/nombre de usuario/

/Aplicaciones/gatos/

no se permitiría. Me preguntaba cómo implementar esta restricción.

Gracias.

Respuesta

13

Tenga en cuenta que NSOpenPanel hereda de NSSavePanel, que a su vez define un delegado y un protocolo delegado correspondiente NSOpenSavePanelDelegate. Puede usar el delegado para extender el comportamiento del panel abierto a fin de incluir la restricción que ha enumerado en su pregunta.

Por ejemplo, suponiendo que el delegado aplicación implementa la restricción panel abierto, hacer que se conforma a la NSOpenSavePanelDelegate protocolo:

@interface AppDelegate : NSObject <NSApplicationDelegate, NSOpenSavePanelDelegate> 
@end 

En la implementación de su aplicación delegue, dice el panel abierto que el delegado aplicación actúa como el delegado panel abierto:

NSOpenPanel *openPanel = [NSOpenPanel openPanel]; 
[openPanel setDirectory:NSHomeDirectory()]; 
[openPanel setCanChooseDirectories:NO]; 
[openPanel setDelegate:self]; 
[openPanel runModal]; 

y poner en práctica los siguientes métodos de delegado:

- (BOOL)panel:(id)sender shouldEnableURL:(NSURL *)url { 
    NSString *path = [url path]; 
    NSString *homeDir = NSHomeDirectory(); 

    return [path hasPrefix:homeDir] && ! [path isEqualToString:homeDir]; 
} 

- (void)panel:(id)sender didChangeToDirectoryURL:(NSURL *)url { 
    NSString *path = [url path]; 
    NSString *homeDir = NSHomeDirectory(); 

    // If the user has changed to a non home directory, send him back home! 
    if (! [path hasPrefix:homeDir]) [sender setDirectory:homeDir]; 
} 

- (BOOL)panel:(id)sender validateURL:(NSURL *)url error:(NSError **)outError { 
    NSString *path = [url path]; 
    NSString *homeDir = NSHomeDirectory(); 

    if (![path hasPrefix:homeDir]) { 
     if (outError) 
      *outError = ; // create an appropriate NSError instance 

     return NO;  
    } 
    return YES; 
} 
+0

Sería genial si pudiera proporcionar una solución adicional en Swift. – ixany

Cuestiones relacionadas