我有一个 NSTableView 列出了使用核心数据存储的标签。标签的默认值是“无标题”,我需要每个标签都是唯一的,所以我有一个验证例程,可以捕获空值和非唯一值,并且工作正常。我不希望用户能够存储标签的“无标题”值,所以我观察 NSControlTextDidEndEditingNotification,它调用以下代码:
- (void)textEndedEditing:(NSNotification *)note {
NSString *enteredName = [[[note userInfo] valueForKey:@"NSFieldEditor"] string];
if ([enteredName isEqualToString:defaultTagName]) {
NSString *dString = [NSString stringWithFormat:@"Rejected - Name cannot be default value of '%@'", defaultTagName];
NSString *errDescription = NSLocalizedStringFromTable( dString, @"Tag", @"validation: default name error");
NSString *errRecoverySuggestion = NSLocalizedStringFromTable(@"Make sure you enter a unique value for the new tag.", @"Tag", @"validation: default name error suggestion");
int errCode = TAG_NAME_DEFAULT_VALUE_ERROR_CODE;
NSArray *objArray = [NSArray arrayWithObjects:errDescription, errRecoverySuggestion, nil];
NSArray *keyArray = [NSArray arrayWithObjects:NSLocalizedDescriptionKey, NSLocalizedRecoverySuggestionErrorKey, nil];
NSDictionary *eDict = [NSDictionary dictionaryWithObjects:objArray forKeys:keyArray];
NSError *error = [[NSError alloc] initWithDomain:TAG_ERROR_DOMAIN code:errCode userInfo:eDict];
NSBeep();
[preferencesWindowsController presentError:error];
unsigned long index = [self rowWithDefaultTag];
[self selectRowIndexes:[NSIndexSet indexSetWithIndex:index] byExtendingSelection:NO];
// [self editColumn:0 row:index withEvent:nil select:YES];
}
}
- (unsigned long)rowWithDefaultTag {
__block unsigned long returnInt;
[managedTags enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
if ([[obj valueForKey:@"name"] isEqualToString:defaultTagName]) {
returnInt = idx;
*stop = YES;
}
}];
return returnInt;
}
注释掉“editColumn”行后,代码就可以工作了,因此如果用户接受默认标签名称而不对其进行编辑,则会构建、显示错误,并通过突出显示表格中的相应行来完成该过程。
但是,我想更进一步,将用户置于编辑模式。当我取消注释“editColumn”行时,行为完全不是我所期望的——tableView 失去了蓝色焦点框,代表新标签的行是空白的。如果我单击 tableView,则该行变为可见。我在这方面花了很多时间,但一无所获,因此非常感谢您提供一些帮助。
(注意:我尝试使用 textDidEndEditing,它的行为也没有达到我的预期,但这是一个单独的问题!)