NSTableView命中选项卡在编辑时从一行跳到另一行

时间:2011-09-24 00:36:41

标签: macos cocoa focus nstableview first-responder

我有一个NSTableView。在编辑时,如果我点击标签,它会自动跳转到下一列。这太棒了,但是当我在最后一栏编辑字段并点击标签时,我希望专注于跳转到NEXT行的第一列。

有什么建议吗?

感谢Michael的首发代码,它非常接近最终的工作!这是我使用的最终代码,希望它对其他人有用:

- (void) textDidEndEditing: (NSNotification *) notification {
    NSInteger editedColumn = [self editedColumn];
    NSInteger editedRow = [self editedRow];
    NSInteger lastColumn = [[self tableColumns] count] - 1;

    NSDictionary *userInfo = [notification userInfo];

    int textMovement = [[userInfo valueForKey:@"NSTextMovement"] intValue];

    [super textDidEndEditing: notification];

    if ( (editedColumn == lastColumn)
        && (textMovement == NSTabTextMovement)
        && editedRow < ([self numberOfRows] - 1)
        )
    {
        // the tab key was hit while in the last column, 
        // so go to the left most cell in the next row
        [self selectRowIndexes:[NSIndexSet indexSetWithIndex:(editedRow+1)] byExtendingSelection:NO];
        [self editColumn: 0 row: (editedRow + 1)  withEvent: nil select: YES];
    }

}

2 个答案:

答案 0 :(得分:2)

通过实施control:textView:doCommandBySelector:

,您可以在不进行子类化的情况下执行此操作
-(BOOL)control:(NSControl *)control textView:(NSTextView *)textView doCommandBySelector:(SEL)commandSelector {

    if(commandSelector == @selector(insertTab:) ) {
        // Do your thing
        return YES;
    } else {
        return NO;
    }   
}

NSTableViewDelegate实现NSControlTextEditingDelegate协议,这是定义此方法的地方)

此方法响应实际的按键,因此您不会受限于textDidEndEditing方法,该方法仅适用于文本单元格。

答案 1 :(得分:1)

子类UITableView并添加代码以捕获textDidEndEditing调用。

然后您可以根据以下内容决定做什么:

- (void) textDidEndEditing: (NSNotification *) notification
{
    NSDictionary *userInfo = [notification userInfo];

    int textMovement = [[userInfo valueForKey:@"NSTextMovement"] intValue];

    if ([self selectedColumn] == ([[self tableColumns] count] - 1))
        (textMovement == NSTabTextMovement)
    {
        // the tab key was hit while in the last column, 
        // so go to the left most cell in the next row
        [yourTableView editColumn: 0 row: ([self selectedRow] + 1)  withEvent: nil select: YES];
    }

    [super textDidEndEditing: notification];
    [[self window] makeFirstResponder:self];

} // textDidEndEditing

此代码未经过测试......没有保修......等等。您可能需要移动[super textDidEndEditing:]调用最右侧单元格中的选项卡。但希望这会帮助你走到终点。让我知道!