Обратите внимание, что NSOpenPanel
наследуется от NSSavePanel
, который, в свою очередь, определяет делегата и соответствующий протокол делегата NSOpenSavePanelDelegate
. Вы можете использовать делегата для расширения поведения открытой панели, чтобы включить ограничение, которое вы перечислили в своем вопросе.
Например, предполагая, что делегат приложения реализует ограничение открытой панели, приведите его в соответствие с протоколом NSOpenSavePanelDelegate
:
@interface AppDelegate : NSObject <NSApplicationDelegate, NSOpenSavePanelDelegate>
@end
В реализации вашего делегата приложения скажите открытой панели, что делегат приложения действует как делегат открытой панели:
NSOpenPanel *openPanel = [NSOpenPanel openPanel];
[openPanel setDirectory:NSHomeDirectory()];
[openPanel setCanChooseDirectories:NO];
[openPanel setDelegate:self];
[openPanel runModal];
И реализовать следующие методы делегата:
- (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;
}