Как ограничить доступный для записи каталог в NSOpenPanel?

Я хочу, чтобы пользователь выбрал каталог для сохранения файлов. Мои самые простые коды (ARC):

NSOpenPanel *panel = [NSOpenPanel openPanel];

[panel setCanChooseDirectories:YES];
[panel setCanChooseFiles:NO];
[panel setAllowsMultipleSelection:NO];

if (NSOKButton == [panel runModal]) 
    return [[panel URLs] objectAtIndex:0];
else
    return nil;

Однако я хочу, чтобы возвращаемый путь был доступен для записи, чтобы в него можно было сохранять файлы. Как мне изменить мои коды?

1 ответ

Решение

Реализовать shouldEnableURL метод делегата следующим образом:

- (BOOL)panel:(id)sender shouldEnableURL:(NSURL *)url
{
    return [[NSFileManager defaultManager] isWritableFileAtPath:[url path]];
}

Это сделает все недоступные для записи пути недоступными для выбора на открытой панели. Объект, который действует как ваш делегат панели, должен соответствовать NSOpenSavePanelDelegate,
Не забудьте установить его через:

[panel setDelegate:self];

Подробную информацию о протоколе NSOpenSavePanelDelegate можно найти в документации.

В Swift вы можете ограничить определенные типы таким образом, реализовав метод делегата URL-адреса shouldEnable.


 func panel(_ sender: Any, shouldEnable url: URL) -> Bool {
        if String(url.pathExtension) == "pdf" {
            return false
        }
        return true
 }
Другие вопросы по тегам