NSTable目前失去焦点:错误

时间:2011-06-07 17:07:27

标签: objective-c validation nstableview nserror

我有一个NSTableView,列出了使用Core Data存储的标签。标签的默认值是“无标题”,我需要每个标签都是唯一的,所以我有一个验证例程,可以捕获空值和非唯一值,并且工作正常。我不希望用户能够存储标签的'无标题'值,所以我观察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'行被注释掉时,代码可以正常工作,因此如果用户接受默认标记名而不编辑它,则会生成错误,显示错误,并通过使表中的相应行突出显示来完成该过程。 / p>

但是,我想更进一步,将用户置于编辑模式。当我取消注释'editColumn'行时,行为完全不是我所期望的 - tableView丢失了它的蓝色焦点框,而代表新标记的行是空白的。如果我单击tableView,该行将变为可见。我花了很多时间在这上面并且无处可去,所以非常感谢你们的一些帮助。

(注意:我尝试使用textDidEndEditing,它也没有按照我的预期行事,但这是一个单独的问题!)

1 个答案:

答案 0 :(得分:0)

回答我自己的问题。卫生署!

我已经有了一个方法,当用户点击按钮添加新标签时,我会将其置于编辑模式:

- (void)objectAdded:(NSNotification *)note {
  if ([[note object] isEqual:self]) {    
    [self editColumn:0 row:[self rowWithDefaultTag] withEvent:nil select:YES];
  }
}

创建通知以调用此方法可以解决问题并将用户正确置于编辑模式。重要的是不要尝试在现有的runloop上执行此操作;所以发送如下通知会推迟发送,直到后来的runloop:

// OBJECTADDED is a previously defined constant.
NSNotification * note = [NSNotification notificationWithName:OBJECTADDED  object:self];
[[NSNotificationQueue defaultQueue] enqueueNotification: note postingStyle: NSPostWhenIdle];

问题解决了。我浪费了很多时间来解决这个问题 - 这是一个经典的例子,它过分介入代码而不是看我正在尝试做什么。 我忘记了我第一次看到这张贴的地方 - 无论你是谁,谢谢你!