Ограничить доступ к определенным папкам с помощью NSOpenPanel

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

/Пользователи/имя пользователя/

Итак, папка

/Пользователи/имя пользователя/кошки/

было бы приемлемо, но

/Пользователи/имя пользователя/

/приложения/кошки/

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

Спасибо.


person minimalpop    schedule 15.04.2011    source источник


Ответы (1)


Обратите внимание, что 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;
}
person Community    schedule 15.04.2011
comment
Было бы здорово, если бы вы могли предоставить дополнительное решение в Swift! - person ixany; 19.07.2017
comment
@ixany • И вопрос, и ответ были опубликованы в 2011 году. Swift 1.0 был представлен в 2014 году. В тегах вопросов нет swift. Человек, ответивший на вопрос, больше не является членом SO. - person Eljay; 17.09.2019