在NSTableView中更改“输入”键行为

时间:2011-10-21 14:08:58

标签: cocoa xcode4

我正在尝试为Mac(而不是iPhone)创建一个简单的数据输入应用程序。 它有一个NSTableView(在NSScrollView中),它包含一个NSTextField,用户可以逐行键入数据。

我到目前为止工作正常,但为了能够在文本字段中输入任何内容,您必须先按“Enter”键。然后,当您按结束处的“Enter”键时,该字段将离开“编辑”模式,但突出显示只位于同一行。必须按下“输入”,“向下箭头”,输入的每行数据之间的“输入”效率不高。

我更喜欢的是,当您按下“Enter”键时,光标向下移动到下一行,该字段将自动进入“编辑”模式。

我原本以为这样的事情应该是相当简单的,但我整个晚上都没有任何进展地撕掉我的头发,我仍然不知道我应该朝哪个方向前进。

我尝试在Xcode的'inspectors'中查找一些属性设置,但看不到任何内容。

在线搜索,建议似乎不断以某种方式回复使用First Responder。玩弄这个,我只是设法让蓝色高亮环按需在我的TableView周围移动,但这似乎仍然没有将文本字段置于“编辑”模式,也不会移动到另一行。

最后,我找到了一些关于子类化和实现自己的文本字段的信息,但这似乎是一种非常漫长而复杂的方法。

有人能指出我如何做到这一点的正确方向吗?

我可能使用了错误的控件吗?也许其他更合适的东西。请注意,每一行都是不同的,所以我不想要像自动换行等等。

1 个答案:

答案 0 :(得分:1)

你和First Responder一起走在了正确的轨道上,但重要的是不要让窗口的Field Editor(NSTextView的一个实例)处理文本编辑,这将成为文本编辑开始时的第一个响应者。字段编辑器在编辑期间通知其客户端(在本例中为表视图)。

处理此问题的最简单方法是继承NSTableView并覆盖其textDidEndEditing:方法。这样的事情应该让你开始:

- (void) textDidEndEditing:(NSNotification *)notification {
    [super textDidEndEditing:notification];

    int textMovement = [[notification.userInfo valueForKey:@"NSTextMovement"] intValue];
    if (NSReturnTextMovement == textMovement) {

        NSText *fieldEditor = notification.object;

        // The row and column for the cell that just ended editing
        NSInteger row = [self rowAtPoint:fieldEditor.frame.origin];
        NSInteger col = [self columnAtPoint:fieldEditor.frame.origin];       

        if (++col >= self.numberOfColumns) {
            col = 0;
            if (++row >= self.numberOfRows) return;
        }

        [self selectRowIndexes:[NSIndexSet indexSetWithIndex:row] 
            byExtendingSelection:NO];
        [self editColumn:col row:row withEvent:nil select:YES];
    }

}

这将从表格的列和行中从左到右,从上到下进行。虽然你说你使用的是NSTextField,但我认为你的意思是你在基于单元格的表中使用了NSTextFieldCell。这是另一个重要的区别。如果您不熟悉字段编辑器的概念,我建议您read up