Cocoa 改变';输入';NSTableView中的关键行为
我正在尝试为Mac(而不是iPhone)创建一个简单的数据输入应用程序。 它有一个NSTableView(在NSScrollView中),其中包含一个NSTextField,用户逐行将数据键入其中 到目前为止,我所做的工作还可以,只是为了能够在文本字段中输入任何内容,必须先按“回车”键。然后,当您在末尾按“回车”键时,字段将离开“编辑”模式,但高亮显示仅位于同一行上。在输入的每一行数据之间必须按“回车”、“向下箭头”、“回车”不是很有效 我更喜欢的是,当您按下“回车”键时,光标向下移动到下一行,字段将自动置于“编辑”模式 我原以为这样的事情应该相当直截了当,但我整个晚上都在胡思乱想,毫无进展,我甚至都不知道该往哪走 我试图在Xcode中的“检查器”中查找一些属性设置,但什么都看不到 在网上搜索时,建议似乎总是以某种方式回到使用第一响应者。在这一点上,我只能按需让蓝色突出显示环在我的TableView周围向下移动,但这似乎仍然没有将文本字段置于“编辑”模式,也没有移动到另一行 最后,我找到了一些关于子类化和实现您自己的文本字段的信息,但这似乎是一个非常漫长而复杂的实现方法 有人能给我指出正确的方向吗Cocoa 改变';输入';NSTableView中的关键行为,cocoa,xcode4,Cocoa,Xcode4,我正在尝试为Mac(而不是iPhone)创建一个简单的数据输入应用程序。 它有一个NSTableView(在NSScrollView中),其中包含一个NSTextField,用户逐行将数据键入其中 到目前为止,我所做的工作还可以,只是为了能够在文本字段中输入任何内容,必须先按“回车”键。然后,当您在末尾按“回车”键时,字段将离开“编辑”模式,但高亮显示仅位于同一行上。在输入的每一行数据之间必须按“回车”、“向下箭头”、“回车”不是很有效 我更喜欢的是,当您按下“回车”键时,光标向下移动到下一行,
我是否使用了错误的控制方式?也许其他的东西更合适。请注意,每一行都是不同的,因此我不希望出现诸如换行等情况。您使用第一响应程序的方法是正确的,但重要的是不要让窗口的字段编辑器(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中随处可见。