- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经使用 DataSource 设置了 NSOutlineView
。
提供给 NSOutlineView
的数据基本上是一个自定义节点树,每个节点(我们称之为 PPDocument
)具有 2 个基本属性(还有更多) ,但这是重要的部分):
当我的过滤器字段(实际上是 NSSearchField
)更改时,我会在大纲 View 上调用 reloadData
。
因此,我决定将整个过滤插入数据源,如下所示:
- (NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(PPDocument*)doc {
if (doc==nil) return [[[[APP documentManager] documentTree] groups] count]; // Root
else
{
if ([[[APP fileOutlineFilter] stringValue] isEqualToString:@""]) // Unfiltered
return [doc noOfChildren];
else
return [doc noOfChildrenFiltered:[[APP fileOutlineFilter] stringValue]];
}
}
- (id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(PPDocument*)doc {
if (doc == nil) return [[[APP documentManager] documentTree] groups][index]; // Root
else
{
if ([[[APP fileOutlineFilter] stringValue] isEqualToString:@""]) // Unfiltered
return [doc childAtIndex:index];
else
return [doc childAtIndex:index filtered:[[APP fileOutlineFilter] stringValue]];
}
}
以及 3 个主要的“过滤”功能:
- (NSArray*)filteredChildren:(NSString*)filter
{
NSMutableArray* ret = [[NSMutableArray alloc] initWithObjects: nil];
if (([self.label contains:filter]) && ([self.children count]==0)) return @[self];
for (PPDocument* d in _children)
{
NSArray* filtered = [d filteredChildren:filter];
if ([filtered count]>0)
{
PPDocument* newDoc = [d copy];
newDoc.children = [filtered mutableCopy];
[ret addObject:newDoc];
}
}
return ret;
}
- (NSInteger)noOfChildrenFiltered:(NSString*)filter
{
NSArray* filtered = [self filteredChildren:filter];
return [filtered count];
}
- (PPDocument*)childAtIndex:(NSInteger)index filtered:(NSString*)filter {
NSArray* filtered = [self filteredChildren:filter];
return (PPDocument*)(filtered[index]);
}
但是,它似乎无法正常工作(+ isGroupItem:
函数突然开始抛出 EXC_BAD_ACCESS
错误)。
有什么想法吗?您注意到任何明显的错误吗?
最佳答案
您的 -filteredChildren:
方法对我来说似乎不正确。
首先,它永远不应该将自身作为其子级之一返回(无论是否经过过滤)。它似乎也不应该复制子节点。
我认为这应该有效:
- (NSArray*)filteredChildren:(NSString*)filter
{
NSIndexSet* indexes = [_children indexesOfObjectsPassingTest:BOOL ^(PPDocument* child, NSUInteger idx, BOOL *stop){
if (child.children.count)
return [[child filteredChildren:filter] count] > 0;
return [child.label contains:filter];
}];
return [_children objectsAtIndexes:indexes];
}
但是,这种方法的问题在于,您正在为项目的每个查询构建已过滤的子项列表。 NSOutlineView
警告数据源方法将被频繁调用并且必须高效。例如,它询问某个项目的子项数量,然后您构建已过滤子项的数组,这需要构建这些子项的已过滤子项的数组等,以便确定某个子项是否应该存在,因为它具有幸存下来的 child 。然后它会询问其中一个 child 有多少个 child ,您必须重建整个子树。
完成此操作后,我让我的节点类跟踪持久数组中的子级和过滤后的子级。每个节点还必须跟踪当前的过滤器。
一种方法是让它们始终保持同步。对子数组所做的任何更改也需要反射(reflect)在已过滤的子数组中。也就是说,如果您添加一个子项并且它通过了过滤器,则将其添加到相应位置的已过滤子项中。如果删除一个子项,它也需要从已过滤的子项数组中删除。
另一种方法是将过滤后的子数组视为缓存。对子数组的任何修改都会使该缓存失效。每当请求过滤后的子数组时,如果它无效,就会重新计算。
无论哪种方式,当节点检测到其过滤子数组已更改或可能已更改(即缓存已失效)从空变为非空或反之亦然时,它需要通知其父级。这是因为它的空性会影响父级是否将其保留在父级的过滤子级列表中。在第一种不断维护已过滤子数组的方法中,您需要一种方法来设置过滤器。这应该既更新当前节点的过滤子节点,又将新的过滤器传递给所有子节点。在第二种方法中,最后使用的过滤器是缓存的一部分。当请求过滤的子数组时,您测试过滤器是否已更改。如果有,则相当于缓存已失效,因此您需要重新计算它。
关于objective-c - 过滤 NSOutlineView 的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25886063/
根据Apple's documentation , NSOutlineView 要求 View 中的每个项目都是唯一的,但是,如果这实际上不符合业务需求怎么办?特别是,如何显示这样的内容 Item A
我有一个基于 View 的 NSOutlineView,我正在努力使项目可编辑。如果我单击一个项目来编辑它,它将从我单击的插入点开始,而不是选择整个文本。按 Enter/Return 进行编辑会选择整
我有一个带有复选框的 NSOutlineView。我将复选框状态绑定(bind)到带有键 shouldBeCopied 的节点项。在节点项中,我有 getter 和 setter,如下所示: -(BO
获得一个在 Controller 的 awakeFromNib 中配置的 NSOutlineView,带有数据源和自动保存的扩展节点。 一切都像魅力一样工作。 问题是在某个地方,有人也在保存滚动位置的
我阅读了关于 Outlineviews 和 DND 的另一篇文章,但我无法让我的程序运行。这篇文章的底部是我的项目 zip 的链接。它非常基本,只有一个大纲 View 和按钮。我希望它接收放置在其上的
我正在尝试将项目的实际折叠/展开状态存储在 NSOutlineView 中,以便稍后可以恢复。 NSOutlineViewDelegate 上有两种方法可用: outlineViewItemDidEx
我最近在没有帐户的情况下启动了另一个线程,因此我使用帐户在此处重新发布问题,以便我可以编辑该程序的当前链接,以便其他用户可以关注此问题。我还更新了下面的代码。这是我原来的问题: 我阅读了关于 Outl
看起来我的数据模型有一些问题,所以我时不时会收到此错误展开项目时。有谁知道这个断言意味着什么? 2010-10-20 03:04:47.547 test_tree[60332:613] * -NSOu
我正在尝试创建一个简单的文件夹浏览器,使用 NSOutlineView 显示树结构。将 monoMac 和 Xamarin Studio 与 XCode 界面生成器一起用于 UI。 我现在遇到的问题是
我有一个用 C# 编写的 MonoMac/Xamarin.MAc 项目。在其中,我有一个派生自 NSOutlineView 的自定义类,它显示某些项目的上下文菜单。通过这样做,而不是仅仅分配 Menu
我有一个简单的 NSOutlineView,通过 swift 初始化,有 2 列。我制作了以下非常简单的数据源,希望通过这种方式进行测试,但也许我这种格式是不允许的。我假设 TableView 仅根据
我想显示一个简单的 nsoutlineview 来显示层次结构。 当我通过 InterfaceBuilder 完成此操作时,一切都很好,但现在我尝试以编程方式进行操作,却遇到了一些麻烦。 这里是我用来
我正在开发一个应用程序,该应用程序需要一个源列表,例如在 Finder 中找到的源列表。到目前为止,我已经让核心数据与 NSOutlineView 一起使用,但组标题看起来不太像源列表。真实的源列表组
我想获取/设置NSOutlineView的选择索引路径。我该怎么做? 没有明显的方法来获取/设置选择索引路径。 如果您尝试绑定(bind)选择索引路径,并且没有将它们绑定(bind)到树 Contro
我创建了一个基于 View 的 NSOutlineView ,其中包含图像和徽章(内联按钮)。虽然自定义单元格足够宽,但我遇到以下问题: 因此,右侧有一个奇怪的边距覆盖了我的徽章(NSOutlineV
我有一个 NSOutlineView,上面有几个项目。每人有 3 个 child (地点、照片和社交)。他们都有相同的 child 。假设用户选择了地点,有谁知道我如何检测哪个项目是所选项目的父项?
我对此感到很难过。当涉及到基于 NSOutlineView 的 View 的对象持久性时,我遇到了非常奇怪的行为。目前我有一个对象,其中包含一个 object1 数组,该对象包含一个 object2
我正在使用基于 View 的 NSOutlineView 来创建源列表。NSOutlineView 连接到数据源和委托(delegate)对象。 但是,我似乎找不到需要实现的内容才能利用部分标题(例如
我正在尝试实现一个带有渐变背景的 NSOutlineView 子类: - (void)drawBackgroundInClipRect:(NSRect)clipRect { [gradient
我遇到了一个非常奇怪的问题: 我将 NSOutlineView 设置为 NSTableViewSelectionHighlightStyleSourceList。在某些情况下,第二级不缩进并与根节点显
我是一名优秀的程序员,十分优秀!