Проверка правильности ввода в представлении NSOpenPanel - PullRequest
3 голосов
/ 05 февраля 2010

Я хотел бы запросить дополнительную информацию от пользователя во время NSOpenPanel, но мне нужно проверить эту информацию до завершения открытия панели. Например, я могу разрешить пользователю добавлять примечание о файле при выборе открытой панели, но мне нужно подтвердить, что этот комментарий не пустой.

У меня есть дополнительное представление, элементы управления которого привязаны к NSObjectController, чей объект содержимого в свою очередь связан с представленным объектом NSViewController, который я использую для загрузки пера дополнительного представления. Представленный объект имеет NSKeyValueCoding -совместимые методы проверки (например, -(BOOL)validateKey:error:). Проверка корректно обрабатывается (и о нарушениях сообщается через модальное диалоговое окно), когда пользователь изменяет значения элементов управления.

Моя проблема в том, что я не могу понять, как получить подтверждение, если пользователь не вводит что-либо в дополнительном представлении. Например, скажем, у меня есть одно текстовое поле в дополнительном представлении, связанный объект которого проверяет, что текст ненулевой длины. Если пользователь вводит текст (проверка прошла успешно), то удаляет текст, проверка не проходит, и пользователю выдается ошибка. Однако, если пользователь не вводит текст, открытая панель закрывается без ошибок. Как я могу проверить, что текст ненулевой до открытой панели отклоняется?

1 Ответ

3 голосов
/ 10 февраля 2010

Вы должны зарегистрировать свой контроллер как делегат открытой панели и затем реализовать метод делегата -panel:isValidFilename:. Возвращение NO из этого метода позволяет предотвратить закрытие открытого диалога:

- (BOOL)panel:(id)sender isValidFilename:(NSString *)filename
{
    //validate the field in some way, in this case by making sure it's not empty
    if([[textField stringValue] length] == 0)
    {
        //let the user know they need to do something
        NSAlert *alert = [[NSAlert alloc] init];
        [alert setMessageText:@"Please enter some text."];
        [alert addButtonWithTitle:@"OK"];
        [alert beginSheetModalForWindow:sender modalDelegate:nil didEndSelector:NULL contextInfo:NULL];
        //return NO to prevent the open panel from completing
        return NO;
    }
    //otherwise, allow the open panel to close
    return YES;
}
...