是否可以使用箭头键和enter/Tab键在NSTableView周围导航NSTableView的可编辑单元格?例如,我想让它看起来更像一个电子表格。
这个应用程序的用户需要编辑相当多的单元格(但不是所有单元格),我认为如果他们不必双击每个单元格,这样做会更容易。
发布于 2009-03-05 23:55:41
嗯,这并不容易,但我设法做到了,而不需要使用RRSpreadSheet或甚至其他控件。下面是你要做的:
NSTextView的子类,这将是字段编辑器。本例将使用名称MyFieldEditorClass,myFieldEditor将引用此类的实例。MyFieldEditorClass添加一个名为"- (void) setLastKnownColumn:(unsigned)aCol andRow:(unsigned) aRow“或类似的方法,并让它保存另一个名为"setTableView:”的方法的两个输入参数值,并让它将NSTableView对象保存在某个地方,或者除非有其他方法可以从字段编辑器中获取NSTableView对象,否则使用该方法。- (void) keyDown:(NSEvent *) event的方法。这实际上覆盖了NSResponder的keyDown:。源代码应该是(请注意,StackOverflow的MarkDown正在将<和>更改为行和列:(NSEvent *) <:(NSEvent*) event { unsigned newRow =<,newCol = column;switch (event keyCode) { case 126: // Up if (>) newRow =<- 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:运行这个程序,试一试!
发布于 2010-04-21 23:13:12
在Sequel Pro中,我们使用了一种不同的(在我看来更简单)方法:我们在TableView的委托中实现了control:textView:doCommandBySelector:。这种方法很难找到--可以在NSControlTextEditingDelegate协议参考中找到。(请记住,NSTableView是NSControl的子类)
长话短说,这是我们想出来的(我们没有覆盖左/右箭头键,因为这些键是用来在单元格中导航的。我们使用Tab向左/向右移动)
请注意,这只是Sequel Pro源代码的一小段,并不能按原样工作
- (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;
}发布于 2009-03-06 08:32:53
与其强迫NSTableView做一些它不是为此而设计的事情,不如考虑使用专门为此目的而设计的东西。我有一个开源的电子表格控件,它可以做你需要的事情,或者你至少可以扩展它来做你需要的事情:MBTableGrid
https://stackoverflow.com/questions/612805
复制相似问题