NSOpenPanel ограничить уже выбранный файл - PullRequest
0 голосов
/ 01 июня 2018

Я добавил NSOpenPanel для выбора папок.Но я хочу добиться следующих случаев:
1. Запретить пользователю выбирать уже выбранные папки.
2. Запретить пользователю выбирать подпапки, если родительская папка уже выбрана.

Или, если описанные выше случаи невозможны, как можно проверить, выбрана ли родительская папка текущей выбранной папки или нет?

//Panel related code
    aPanel = [NSOpenPanel openPanel];
    [aPanel setMessage:@"Choose folders"];
    [aPanel setPrompt:@"Select"];
    [aPanel setNameFieldLabel:@"Location"];
    [aPanel setAllowsMultipleSelection:YES];
    [aPanel setCanChooseDirectories:YES];
    [aPanel setDirectoryURL:[NSURL fileURLWithPath:NSHomeDirectory()]];
    [aPanel setDelegate:self];
    dispatch_async(dispatch_get_main_queue(), ^
    {
        [aPanel beginSheetModalForWindow:self.view.window completionHandler:^(NSInteger result)
        {
            if (result == NSFileHandlingPanelOKButton)
            {
                for (NSURL *folderPath in [aPanel URLs])
                {
                    [files addObject:[folderPath path]];
                }
            }
        }];
    });

//Filter method handle
    - (BOOL)panel:(id)sender shouldEnableURL:(NSURL *)url {
        BOOL result = YES;
        for (NSString *urlPath in files) {
            result  = result && ( [url.path hasPrefix:urlPath] ||  [urlPath isEqualTo:url.path] ? NO : YES);
        }
        return result;
    }

Здесь файлы - старый список выбранных папок с путями типа строки

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Вы добавили NSLog() звонки или использовали отладчик, чтобы посмотреть, что происходит?Подумайте еще раз об условиях, при которых вам нужно shouldEnableURL, чтобы вернуть YES / NO.Например, рассмотрим:

  • Я думаю, что вы хотите вернуть YES, если любой путей в files и проверяемый URL удовлетворяет некоторому условию. Любой предлагает или (||), но ваша логика использует и (&&).Также any предполагает, что вы можете вернуться непосредственно в цикл, поскольку, как только ваше условие выполнено с одним путем из files, нет необходимости проверять другие.
  • Использование троичного условного оператора? :
    • Каков приоритет этого по сравнению с ||, т.е. ваше выражение оценивается как (a || b) ? NO : YES или как a || (b ? NO : YES)?
    • Не пишите e ? NO : YES,вместо этого используйте логический оператор , а не , как в !e

Учитывая вышеизложенное и используя NSLog() / отладчик, вы быстро сможетеопределить логику, необходимую для возврата необходимого логического значения (что бы это ни было).

HTH

0 голосов
/ 01 июня 2018

NSOpenSavePanelDelegate's -panel: shouldEnableURL: метод позволяет отключить URL-адреса, чтобы их нельзя было выбрать:

https://developer.apple.com/documentation/appkit/nsopensavepaneldelegate/1535200-panel?language=objc

...