我想在NSOpenPanel期间向用户索取其他信息,但需要在打开的面板完成之前验证该信息。例如,我可能希望允许用户在打开的面板选择中添加有关该文件的注释,但需要验证该注释不为空。
我有一个附件视图,其控件绑定到NSObjectController
,其内容对象依次绑定到我用来加载附件视图的nib的NSViewController的表示对象。表示的对象具有NSKeyValueCoding
- 兼容的验证方法(例如-(BOOL)validateKey:error:
)。当用户修改控件的值时,可以正确处理验证(以及通过模式对话框报告的违规)。
我的问题是,如果用户未在附件视图中输入任何内容,我无法弄清楚如何获得验证。例如,假设我在附件视图中有一个文本字段,其绑定对象验证文本的长度不为零。如果用户输入文本(验证成功),则删除文本,验证失败,并向用户显示错误。但是,如果用户未输入文本,则打开的面板会无误地解除。如何在打开面板解除之前验证文本是否为非
答案 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;
}