首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带有NSTableView的箭头键

带有NSTableView的箭头键
EN

Stack Overflow用户
提问于 2009-03-04 22:43:31
回答 4查看 5.9K关注 0票数 15

是否可以使用箭头键和enter/Tab键在NSTableView周围导航NSTableView的可编辑单元格?例如,我想让它看起来更像一个电子表格。

这个应用程序的用户需要编辑相当多的单元格(但不是所有单元格),我认为如果他们不必双击每个单元格,这样做会更容易。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-03-05 23:55:41

嗯,这并不容易,但我设法做到了,而不需要使用RRSpreadSheet或甚至其他控件。下面是你要做的:

  1. 创建NSTextView的子类,这将是字段编辑器。本例将使用名称MyFieldEditorClassmyFieldEditor将引用此类的实例。
  2. MyFieldEditorClass添加一个名为"- (void) setLastKnownColumn:(unsigned)aCol andRow:(unsigned) aRow“或类似的方法,并让它保存另一个名为"setTableView:”的方法的两个输入参数值,并让它将NSTableView对象保存在某个地方,或者除非有其他方法可以从字段编辑器中获取NSTableView对象,否则使用该方法。
  3. 添加另一个名为- (void) keyDown:(NSEvent *) event的方法。这实际上覆盖了NSResponderkeyDown:。源代码应该是(请注意,StackOverflow的MarkDown正在将<>更改为行和列:(NSEvent *) &lt;:(NSEvent*) event { unsigned newRow =&lt;,newCol = column;switch (event keyCode) { case 126: // Up if (>) newRow =&lt;- 1;break;案例125: //向下if (row < theTable numberOfRows - 1) newRow = row + 1;break;案例123: // Left if (column > 1) newCol = column - 1;break;例124: // Right if (column < theTable numberOfColumns - 1) newCol = column + 1;break;default: super keyDown:event;return;} theTable selectRow:newRow byExtendingSelection:NO;theTable editColumn:newCol row:newRow withEvent:nil select:YES;row = newRow;column = newCol;在nib中添加一个委托,并在委托中添加method:
  • (BOOL) tableView:(NSTableView *)aTableView shouldEditColumn:(NSTableColumn *) aCol NSTableView :aRow{ if (aTableView in }
  1. Give :TheTableViewYouWantToChangeBehaviour) [myFieldEditor setLastKnownColumn:[aTableView tableColumns indexOfObject:aCol] andRow:aRow];return YES;}
    1. Finally,为表视图的主窗口添加一个委托,并添加method:
    • (id) windowWillReturnFieldEditor:(NSWindow *) aWindow toObject:(id) anObject { if (anObject‘s:TheTableViewYouWantToChangeBehaviour){ if (! myFieldEditor ) { myFieldEditor = [MyFieldEditorClass alloc ];myFieldEditor setTableView:anObject;} return myFieldEditor;} else { return nil;} }

运行这个程序,试一试!

票数 5
EN

Stack Overflow用户

发布于 2010-04-21 23:13:12

在Sequel Pro中,我们使用了一种不同的(在我看来更简单)方法:我们在TableView的委托中实现了control:textView:doCommandBySelector:。这种方法很难找到--可以在NSControlTextEditingDelegate协议参考中找到。(请记住,NSTableView是NSControl的子类)

长话短说,这是我们想出来的(我们没有覆盖左/右箭头键,因为这些键是用来在单元格中导航的。我们使用Tab向左/向右移动)

请注意,这只是Sequel Pro源代码的一小段,并不能按原样工作

代码语言:javascript
运行
复制
- (BOOL)control:(NSControl *)control textView:(NSTextView *)textView doCommandBySelector:(SEL)command
{
    NSUInteger row, column;

    row = [tableView editedRow];
    column = [tableView editedColumn];

    // Trap down arrow key
    if (  [textView methodForSelector:command] == [textView methodForSelector:@selector(moveDown:)] )
    {
        NSUInteger newRow = row+1;
        if (newRow>=numRows) return TRUE; //check if we're already at the end of the list
        if (column>= numColumns) return TRUE; //the column count could change

        [tableContentView selectRowIndexes:[NSIndexSet indexSetWithIndex:newRow] byExtendingSelection:NO];
        [tableContentView editColumn:column row:newRow withEvent:nil select:YES];
        return TRUE;
    }

    // Trap up arrow key
    else if (  [textView methodForSelector:command] == [textView methodForSelector:@selector(moveUp:)] )
    {
        if (row==0) return TRUE; //already at the beginning of the list
        NSUInteger newRow = row-1;

        if (newRow>=numRows) return TRUE;
        if (column>= numColumns) return TRUE;

        [tableContentView selectRowIndexes:[NSIndexSet indexSetWithIndex:newRow] byExtendingSelection:NO];
        [tableContentView editColumn:column row:newRow withEvent:nil select:YES];
        return TRUE;
    }
票数 10
EN

Stack Overflow用户

发布于 2009-03-06 08:32:53

与其强迫NSTableView做一些它不是为此而设计的事情,不如考虑使用专门为此目的而设计的东西。我有一个开源的电子表格控件,它可以做你需要的事情,或者你至少可以扩展它来做你需要的事情:MBTableGrid

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/612805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档