【问题标题】:Change 'enter' key behaviour in NSTableView更改 NSTableView 中的“输入”键行为
【发布时间】:2011-10-21 14:08:58
【问题描述】:

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

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

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

本以为这样的事情应该是相当简单的,但是我整晚都在扯头发,没有任何进展,我什至不知道该往哪个方向走。

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

在网上搜索时,建议似乎不断回到以某种方式使用 First Responder。玩这个,我只设法让蓝色突出显示环按需在我的 TableView 周围向下移动,但这似乎仍然没有将文本字段置于“编辑”模式,也没有移动到另一行。

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

有人可以为我指出正确的方向吗?

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

【问题讨论】:

    标签: cocoa xcode4


    【解决方案1】:

    您在 First Responder 的轨道上是正确的,但重要的是不要由窗口的字段编辑器(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

    【讨论】:

    • 谢谢你,这正是我想要的。
    • 回顾我昨晚的所作所为,我发现我是从错误的角度解决问题。我在玩各个文本字段,但我应该查看表格视图 - 它控制所有文本字段 - 作为控制的地方。 MVC 模式在 Cocoa 中随处可见。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多