NSTextFieldCell委托?

时间:2009-05-27 20:16:26

标签: objective-c cocoa

我在表格视图中有一个文本字段单元格,我需要在结束编辑时知道它。我以为我会将我的Controller类设置为文本字段单元的委托,然后使用NSTextField的委托方法textDidEndEditing:,但是意识到文本字段单元似乎没有委托方法?为什么这样,在编辑完成后我能做什么(除了子类化)?

由于

2 个答案:

答案 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];
}