Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 改变';输入';NSTableView中的关键行为_Cocoa_Xcode4 - Fatal编程技术网

Cocoa 改变';输入';NSTableView中的关键行为

Cocoa 改变';输入';NSTableView中的关键行为,cocoa,xcode4,Cocoa,Xcode4,我正在尝试为Mac(而不是iPhone)创建一个简单的数据输入应用程序。 它有一个NSTableView(在NSScrollView中),其中包含一个NSTextField,用户逐行将数据键入其中 到目前为止,我所做的工作还可以,只是为了能够在文本字段中输入任何内容,必须先按“回车”键。然后,当您在末尾按“回车”键时,字段将离开“编辑”模式,但高亮显示仅位于同一行上。在输入的每一行数据之间必须按“回车”、“向下箭头”、“回车”不是很有效 我更喜欢的是,当您按下“回车”键时,光标向下移动到下一行,

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

到目前为止,我所做的工作还可以,只是为了能够在文本字段中输入任何内容,必须先按“回车”键。然后,当您在末尾按“回车”键时,字段将离开“编辑”模式,但高亮显示仅位于同一行上。在输入的每一行数据之间必须按“回车”、“向下箭头”、“回车”不是很有效

我更喜欢的是,当您按下“回车”键时,光标向下移动到下一行,字段将自动置于“编辑”模式

我原以为这样的事情应该相当直截了当,但我整个晚上都在胡思乱想,毫无进展,我甚至都不知道该往哪走

我试图在Xcode中的“检查器”中查找一些属性设置,但什么都看不到

在网上搜索时,建议似乎总是以某种方式回到使用第一响应者。在这一点上,我只能按需让蓝色突出显示环在我的TableView周围向下移动,但这似乎仍然没有将文本字段置于“编辑”模式,也没有移动到另一行

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

有人能给我指出正确的方向吗


我是否使用了错误的控制方式?也许其他的东西更合适。请注意,每一行都是不同的,因此我不希望出现诸如换行等情况。

您使用第一响应程序的方法是正确的,但重要的是不要让窗口的字段编辑器(NSTextView的一个实例)处理文本编辑,当文本编辑开始时,它将成为第一响应程序。字段编辑器在编辑期间通知其客户端(在本例中为表视图)

处理此问题的最简单方法是将NSTableView子类化并重写其textdidediting:方法。像这样的事情应该让你开始:

- (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。这是另一个重要的区别。如果您不熟悉field editor的概念,我建议您。

谢谢,它正是我想要的。回顾我昨晚所做的,我可以看出我是从错误的角度来解决问题的。我在处理单个文本字段,但我应该将控制所有文本字段的表视图视为控制的位置。MVC模式在Cocoa中随处可见。