【发布时间】:2010-02-09 05:37:19
【问题描述】:
我在表格视图中有一个文本字段单元格,当它结束编辑时我需要知道它。我以为我会将我的Controller类设置为文本字段单元格的委托,然后使用NSTextField的委托方法textDidEndEditing:,但意识到文本字段单元格似乎没有委托方法?为什么会这样,我可以做什么(除了子类化)在编辑完成时得到通知?
谢谢
【问题讨论】:
标签: objective-c cocoa
我在表格视图中有一个文本字段单元格,当它结束编辑时我需要知道它。我以为我会将我的Controller类设置为文本字段单元格的委托,然后使用NSTextField的委托方法textDidEndEditing:,但意识到文本字段单元格似乎没有委托方法?为什么会这样,我可以做什么(除了子类化)在编辑完成时得到通知?
谢谢
【问题讨论】:
标签: objective-c cocoa
NSTextFieldCell 继承自 NSCell(从技术上讲,从 NSActionCell 继承自 NSCell)。 NSCell 类用于(来自docs):
NSCell 类提供了一种在 NSView 对象中显示文本或图像的机制,而无需完整的 NSView 子类的开销。
值得注意的是,cell 类用于“显示文本或图像”,而不是处理与用户的交互。同样,使用NSTextField 类:
NSTextField 类使用 NSTextFieldCell 类来实现其用户界面。
NSTextField 处理实际的用户输入,同时使用文本字段单元格来简单地实现其用户界面,类似地,通过NSTextField 提供在文本编辑结束时提供通知的委托方法类,不通过NSTextFieldCell类。
如果您想在编辑以NSTableView 结束时收到通知,那么您需要将自己注册为NSTextDidEndEditingNotification 的观察者(如果您不熟悉,可能需要阅读NSNotificationCenter 类参考通知)。为此,请将以下内容放在您的控制器类中; 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];
}
您将观察到的对象设置为 NSTableView 实例(而不是单元格本身)的原因是,在后台,当您编辑表格中的单元格时,您正在处理的单元格没有被直接编辑;它是窗口的(或自定义的)字段编辑器。编辑结束时,字段编辑器然后将该单元格的新值传递到表格视图。但是,表格视图会发布通知,说明单元格已完成编辑。
【讨论】:
在 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];
}
【讨论】: