验证NSOpenPanel附件视图中的输入

时间:2010-02-04 21:06:40

标签: cocoa macos cocoa-bindings

我想在NSOpenPanel期间向用户索取其他信息,但需要在打开的面板完成之前验证该信息。例如,我可能希望允许用户在打开的面板选择中添加有关该文件的注释,但需要验证该注释不为空。

我有一个附件视图,其控件绑定到NSObjectController,其内容对象依次绑定到我用来加载附件视图的nib的NSViewController的表示对象。表示的对象具有NSKeyValueCoding - 兼容的验证方法(例如-(BOOL)validateKey:error:)。当用户修改控件的值时,可以正确处理验证(以及通过模式对话框报告的违规)。

我的问题是,如果用户未在附件视图中输入任何内容,我无法弄清楚如何获得验证。例如,假设我在附件视图中有一个文本字段,其绑定对象验证文本的长度不为零。如果用户输入文本(验证成功),则删除文本,验证失败,并向用户显示错误。但是,如果用户未输入文本,则打开的面板会无误地解除。如何在打开面板解除之前验证文本是否为非

1 个答案:

答案 0 :(得分:3)

您应该将控制器注册为开放面板的委托,然后实施-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;
}