我在表格视图中有一个文本字段单元格,我需要在结束编辑时知道它。我以为我会将我的Controller类设置为文本字段单元的委托,然后使用NSTextField的委托方法textDidEndEditing:,但是意识到文本字段单元似乎没有委托方法?为什么这样,在编辑完成后我能做什么(除了子类化)?
由于
答案 0 :(得分:15)
NSTextFieldCell
继承自NSCell
(技术上来自NSActionCell
继承自NSCell
)。 NSCell
类用于(来自docs):
NSCell类提供了一种在NSView对象中显示文本或图像的机制,而没有完整NSView子类的开销。
值得注意的是,单元格类用于“显示文本或图像”,而不用于处理与用户的交互。同样,使用NSTextField
类:
NSTextField类使用NSTextFieldCell类来实现其用户界面。
NSTextField
处理实际的用户输入,同时使用文本字段单元来简单地实现其用户界面,同样,通过{提供文本编辑结束时提供通知的委托方法{ {1}}类和不通过NSTextField
类。
如果您希望在NSTextFieldCell
中收到编辑结束的通知,那么您需要将自己注册为NSTableView
的观察者(您可能需要阅读NSNotificationCenter课程如果您不熟悉通知,请参考)。为此,请将以下内容放在控制器类中; NSTextDidEndEditingNotification
函数是一个包含它的好地方,以确保在应用程序启动时调用它:
awakeFromNib
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self
selector:@selector(textDidEndEditing:)
name:NSTextDidEndEditingNotification
object:tableView];
是指向tableView
对象的指针。然后,只需按如下方式实现该方法:
NSTableView
在释放时不要忘记将自己当作观察者:
- (void)textDidEndEditing:(NSNotification *)aNotification
{
// Do what you want here
}
您将正在观察的对象设置为- (void)dealloc
{
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc removeObserver:self];
}
实例(而不是单元本身)的原因在于,当您编辑表格中的单元格时,您所在的单元格处理不是直接编辑;它是窗口(或自定义)字段编辑器。编辑结束时,字段编辑器然后将该单元格的新值传递给表视图。但是,表格视图将发布通知,表示单元格已完成编辑。
答案 1 :(得分:0)
在NSTableViewDataSource协议中实现tableView:setObjectValue:forTableColumn:row:
方法。将它放在您已实施的tableView:objectValueForTableColumn:row:
方法旁边。
- (void)tableView:(NSTableView *)aTableView
setObjectValue:(id)anObject
forTableColumn:(NSTableColumn *)aTableColumn
row:(NSInteger)rowIndex
{
[mutableArrayWithStrings replaceObjectAtIndex:rowIndex withObject:anObject];
}