我有一个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];
}
}
答案 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:]调用最右侧单元格中的选项卡。但希望这会帮助你走到终点。让我知道!