CoreDataを使用して保存されているタグを一覧表示する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を使用してみましたが、これも期待どおりに動作しませんでしたが、これは別の問題です!)