Ограничить доступ к определенным папкам с помощью NSOpenPanel - PullRequest
5 голосов
/ 16 апреля 2011

Я использую NSOpenPanel, чтобы позволить пользователю выбрать папку для сохранения документов.Я хотел бы ограничить, в какую папку (с точки зрения иерархии) они могут сохранить.По сути, я хочу запретить им выбирать любую папку выше:

/ Users / username /

Итак, папка

/ Users/ username / cats /

будет приемлемым, но

/ Users / username /

/ Applications / cats /

не будет разрешено.Мне было интересно, как реализовать это ограничение.

Спасибо.

1 Ответ

16 голосов
/ 16 апреля 2011

Обратите внимание, что 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;
}
...