gpt4 book ai didi

cocoa - 更改 NSTableView 中的 'enter' 关键行为

转载 作者:行者123 更新时间:2023-12-03 16:43:52 25 4
gpt4 key购买 nike

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

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

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

我本来以为这样的事情应该是很简单的,但是我一晚上都在抓狂,毫无进展,我什至不知道自己该往哪个方向走。

我尝试在 Xcode 的“检查器”中查找一些属性设置,但什么也没看到。

在线搜索时,建议似乎不断以某种方式返回到使用急救人员。通过这个操作,我只设法让蓝色突出显示环根据需要在我的 TableView 周围向下移动,但这似乎仍然没有将文本字段置于“编辑”模式,也没有移动到另一行。

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

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

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

最佳答案

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

处理这个问题的最简单方法是子类化 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 .

关于cocoa - 更改 NSTableView 中的 'enter' 关键行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7850607/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com