我目前有一个tableview,其中包含单元格视图,其中包含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;
}
问题是,这只有一半的时间。我第一次尝试选择一行时,第一响应者状态返回到表视图。第二次,它完美地工作,文本字段具有焦点。第三次,它再次破裂。第四个 - 它是完美的!出于某些奇怪的原因,代码只能每隔一段时间运行一次......
任何人都知道为什么会这样?非常感谢任何有启发性的反馈。
答案 0 :(得分:2)
当从tableView中的textField切换到textField时,会以意外的顺序调用事件(直到你想到它为止)。
这里的问题是调用委托方法的顺序。
假设您从textField1转到textField2。
一旦textField1处于活动状态并单击textField2,就会像这样调用它们:
textShouldBeginEditing (textField2)
textShouldEndEditing (textField1)
textDidEndEditing (textField1)
textDidBeginEditing (textField2)
因为在textShouldBeginEditing
之前调用了textDidEndEditing
(因为它需要确保 >在放弃其旧版之前选择该行),您需要更新取而代之的是self.textField
中的textDidBeginEditing
。