Как ограничить доступный для записи каталог в 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
}