2

我目前有一个表格视图,其中包含 NSTextFields 的单元格视图。目前,在行选择时,我正在向单元格视图发送以下消息,希望在单元格视图第一响应者状态中授予 NSTextView:

- (void)notifyOfSelectionInWindow:(NSWindow *)window {
    [[self textField] setEditable:YES];
    [[self textField] setSelectable:YES];
    // make textField (textView) first responder
    [[self textField] selectText:nil];
    [[[self textField] currentEditor] setSelectedRange:NSMakeRange([[[self textField] stringValue] length], 0)];      
}

因为我不希望 NSTextFields 在未选择它们所在的行时可编辑,所以我也在我的自定义 NSTextField 子类中执行此操作:

- (void)textDidEndEditing:(NSNotification *)notification {
    [self setEditable:NO];
    [self setSelectable:NO];
    [super textDidEndEditing:notification];
}

选择更新代码:(请注意,我也在此处更改行高)

- (BOOL)tableView:(NSTableView *)tableView shouldSelectRow:(NSInteger)row {
    // get the table veiw to animate/recalculate height of row
    NSMutableIndexSet *changedRows = [NSMutableIndexSet indexSet];
    [changedRows addIndex:row];
    [changedRows addIndex:[tableView selectedRow]];
    [tableView noteHeightOfRowsWithIndexesChanged:changedRows];
    [rowView notifyOfSelectionInWindow:[self window]]; 
    // ^ this in turn calls a method of the same name of the corresponding cell view
    return YES;
}

问题是,这只有一半的时间有效。我第一次尝试选择一行时,第一响应者状态返回到表视图。第二次,它完美地工作,并且文本字段具有焦点。第三次,又断了。第四——完美!出于某种奇怪的原因,该代码每隔一段时间才有效......

有人知道为什么会这样吗?非常感谢任何有启发性的反馈。

4

1 回答 1

2

在 tableView 中从 textField 切换到 textField 时,会以意想不到的顺序调用事件(直到您考虑它)。

这里的问题是您的委托方法被调用的顺序。

假设您要从 textField1 转到 textField2。

一旦 textField1 已经处于活动状态并且您单击 textField2,它们就会像这样被调用:

textShouldBeginEditing  (textField2)
textShouldEndEditing    (textField1)
textDidEndEditing       (textField1)
textDidBeginEditing     (textField2)

因为textShouldBeginEditing之前被调用textDidEndEditing(因为它需要确保它可以在放弃它的旧行之前选择行)你需要更新你self.textFieldtextDidBeginEditing

于 2012-04-07T03:58:30.863 回答