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;
}
Sería genial si pudiera proporcionar una solución adicional en Swift. – ixany