objective-c - TableView :shouldEditTableColumn:row: for view-based NSTableView

标签 objective-c cocoa nstableview

根据 Apple's documentation on [NSTableViewDelegate tableView:shouldEditTableColumn:row:] ,“此方法仅对基于 NSCell 的 TableView 有效”。基于 View 的 TableView 的等价物是什么?我想用自定义编辑体验替换默认的内联编辑。

最佳答案

评论 Astoria 的方法:

当模型的可编辑性发生变化时必须更改文本字段的可编辑性的不方便“问题”是您必须“主动”跟踪模型的可编辑性并更新文本字段的可编辑性。

相比之下,基于单元格的 TableView 的委托(delegate)方法将对可编辑性的关注推迟到用户尝试进行编辑的那一刻,此时委托(delegate)仅返回模型是否可以编辑。设置少了很多,犯错的可能性也小了。 (例如,根据您如何监控/响应模型中的可编辑性,您可能会错过更改,现在用户可能会错误地编辑或不编辑该字段。)

因此,一种不同的方法是在用户尝试编辑时重新创建确定可编辑性的委托(delegate)。为此,您需要将 NSTextField 子类化,覆盖“正确的位置”,询问委托(delegate)人,并允许或禁止可编辑性。

“正确的位置”似乎是覆盖 acceptsFirstResponder,并返回 NO。

- (BOOL)acceptsFirstResponder
{
    BOOL accepts = [super acceptsFirstResponder];

    if (accepts) {
        if ([self.delegate respondsToSelector:@selector(textFieldShouldBecomeEditable:)]) {
            accepts = [self.delegate textFieldShouldBecomeEditable:self];
        }
    }

    return accepts;
}

如上,只要该字段的editable为YES,就调用delegate进行最终确定。

根据您的应用程序,这可能是一种更理想的方法,因为监视对模型可编辑性的更改并不直接。但是,一般来说,简单地设置字段的 editable 属性的标准方法是最好的。

关于objective-c - TableView :shouldEditTableColumn:row: for view-based NSTableView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27023976/

相关文章:

cocoa - Swift/Cocoa 中 NSTableView 的动态行高

cocoa - NSTableView 奇怪的问题

ios - 将 GMSMarker 添加到 map 时,应用程序仅在 iPhone 5 上崩溃 : EXC_BAD_ACCESS

objective-c - 是否有可能比最近的父类(super class)(即 super.super)更深入?

cocoa - 在 openfire 中注册新用户?

cocoa - 如何根据表格中的内容设置行高?

objective-c - 获取 yAxis 的时间

ios - 后台 UIDevice CFDictionaryGetValue 错误

objective-c - 如何防止对 NSOutlineView 的父节点进行排序?

objective-c - 检查磁盘上文件是否存在?