【问题标题】:NSTextFieldCell Delegate?NSTextFieldCell 代表?
【发布时间】:2010-02-09 05:37:19
【问题描述】:

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

谢谢

【问题讨论】:

    标签: objective-c cocoa


    【解决方案1】:

    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 实例(而不是单元格本身)的原因是,在后台,当您编辑表格中的单元格时,您正在处理的单元格没有被直接编辑;它是窗口的(或自定义的)字段编辑器。编辑结束时,字段编辑器然后将该单元格的新值传递到表格视图。但是,表格视图会发布通知,说明单元格已完成编辑。

    【讨论】:

    • 我发现“TextDidEndEditing:”方法有效,但“TextDidBeginEditing:”方法无效。你有什么想法吗?
    【解决方案2】:

    在 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];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-28
      • 2018-02-19
      • 1970-01-01
      相关资源
      最近更新 更多