如何在NSTableView中将自定义视图单元格置于表格行之上?

10

当我将自定义视图用作基于视图的NSTableView的单元格时,自定义视图会略微低于表行。当我单击它时,而不是影响元素(例如文本字段)自定义视图,表行会被选中(并突出显示)。我必须重新单击以选择文本字段。

- (NSView*)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
    NSLog(@"We are creating views!");
    NSTableCellView *newView;
    newView = [tableView makeViewWithIdentifier:@"PostCell" owner:self];


    NSTextField *newTextField = [[NSTextField alloc] init];
    [newView addSubview:newTextField];

    return newView;
}

当我根据NSTableView - Disable Row Selection禁用行选择时,就不会有选择了。

突出显示前面

- (BOOL)selectionShouldChangeInTableView:(NSTableView *)tableView {
    return NO;
}

但是我仍然无法直接选择文本框。更糟糕的是,我甚至不能使用鼠标选择它。只能使用键盘上的 tab 键。

无法选择

似乎有一些东西在它的上方。但是它是界面生成器中显示的“表列”吗?还是其他什么东西?

我该如何修复这个问题?


你如何初始化UITableViewCell?cell.contentView = customView?如果是的话,你应该考虑添加视图而不是替换它:[cell.contentView addSubview:customView] - blld
@AurélienBouilland,在界面构建器中将自定义视图拖到表列的下方(作为其子级),将类设置为我的视图类,并使用NSTableCellView *newView; newView = [tableView makeViewWithIdentifier:@"PostCell" owner:self]; - Colliot
@AurélienBouilland,有关其他详细信息,请参阅使用Interface Builder创建的自定义视图在调用其他视图时无法呈现 - Colliot
你介意放一些代码或截图吗? - Sruit A.Suk
@SruitA.Suk,请查看我的更新。 - Colliot
2个回答

4

使用NSTableView的自定义子类,并重写-validateProposedFirstResponder:forEvent:方法来返回YES

参见这篇博客文章,作者是编写基于视图的表格视图代码的苹果工程师。


1
请确认以下代码已存在。
- (BOOL)tableView:(NSTableView *)aTableView shouldSelectRow:(NSInteger)rowIndex {
return YES; 
}

你可以尝试记录子视图,或者检查视图的父视图。这将有助于理解视图层次结构。
另外需要注意的是,如果其中一个视图的用户交互被禁用,则其子视图将无法接收事件。请验证所有视图及其子视图的用户交互是否启用。
希望这可以帮到你。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接