标签: nstreecontroller

NSOutlineView:删除显示三角形和缩进

我正在使用NSOutlineView进行项目,似乎无法弄清楚两件事:

  • 如何删除树节点的显示三角形.像iTunes这样的应用似乎能够做到这一点:

替代文字

是否有某种用于此的NSOutlineView Delegate方法?或者它需要一个子类?

  • 如何禁用项目的缩进.我尝试使用setIndentationPerLevel:并将其设置为0,以及在Interface Builder中将列缩进更改为0,但它似乎没有任何效果.

cocoa objective-c nsoutlineview nstreecontroller

26
推荐指数
3
解决办法
8356
查看次数

内容更新时,NSOutlineView会跳到顶部

我有一个NSOutlineView显示目录层次结构.它绑定到一个NSTreeController绑定到我的类来管理文件系统节点.当发生文件系统事件时,我在children密钥路径上触发KVO通知,这会导致大纲视图更新.但是当它更新时,它会突然滚动到最顶端.我希望滚动位置保持不变.有任何想法吗?

这是FS事件发生时运行的代码:

- (void)URLWatcher:(CDEvents *)URLWatcher eventOccurred:(CDEvent *)event {
    [self willChangeValueForKey:@"children"];
    children = nil; // this will refreshed next time children is called
    [self didChangeValueForKey:@"children"];
}
Run Code Online (Sandbox Code Playgroud)

这是在模型中,所以我无法访问该视图.

cocoa nsoutlineview nstreecontroller

15
推荐指数
2
解决办法
480
查看次数

NSOutlineView和NSTreeController示例

请给我一些关于如何在不使用核心数据的情况下将NSOutlineViewNSTreeController绑定一起使用的链接.

objective-c nsoutlineview nstreecontroller cocoa-bindings

12
推荐指数
1
解决办法
2万
查看次数

给定模型对象,如何在NSTreeController中找到索引路径?

给定NSTreeController表示的模型对象,如何在树中找到它们的索引路径并随后选择它们?这似乎是一个非常明显的问题,但我似乎无法找到它的任何参考.有任何想法吗?

cocoa nstreecontroller nsindexpath

8
推荐指数
1
解决办法
4000
查看次数

使用NSTreeController,在更改模型数组时是否必须手动重新加载NSOutlineView?

我有一个类似树的模型,我希望使用NSTreeController在NSOutlineView中显示.

我能够设置绑定,只要我使用NSTreeController的插入和删除函数来更改我的模型树,一切正常.如果我尝试直接从模型树插入或删除,在某些情况下NSOutlineView不会更新.

如果我将对象插入到扩展的对象组中,它的工作原理如下:

插入节点

新节点显示

但是如果我尝试将第一个对象添加到节点中,之前没有子节点,则没有任何反应.显示三角形没有出现,所以我无法扩展它以查看新节点.

插入新的孩子

在此输入图像描述

如果我将鼠标悬停在具有新对象的节点上,它将被展开,我可以添加第二个没有问题的子节点.但三角形仍然是隐形的:

在此输入图像描述

最后,如果我关闭所有这些节点的父节点并再次打开它们(触发重新加载),则会突然出现三角形:

在此输入图像描述

这就是为什么我想知道是否必须手动重新加载NSOutlineView的行以使三角形可见,或者我是否搞砸了什么?谢谢!!

更新:

在我的Node类中,我添加了一个像这样的新子节点:

- (void)addChild:(MyNode *)child {
    [self willChangeValueForKey:@"childNodes"];
    [children addObject:child];
    [self didChangeValueForKey:@"childNodes"];
}
Run Code Online (Sandbox Code Playgroud)

我也实现了这些(我在IB中为我的NSTreeController设置):

- (NSArray *)childNodes {
    return [NSArray arrayWithArray:children];
}

- (NSInteger)countOfChildNodes {
    return [children count];
}

- (BOOL)nodeIsLeaf {
    return [children count] < 1;
}
Run Code Online (Sandbox Code Playgroud)

我知道这(特别是childNodes)并没有得到很好的优化,但我现在只是在试验,因为在最终版本中我的孩子将被存储在C数组中.

更新2:

我也试过发送其他2个属性的KVO通知,但这也没有帮助.

- (void)addChild:(MyNode *)child {
    NSLog(@"%@", NSStringFromSelector(_cmd));
    [self willChangeValueForKey:@"nodeIsLeaf"];
    [self willChangeValueForKey:@"countOfChildNodes"];
    [self willChangeValueForKey:@"childNodes"];
    [children addObject:child];
    [self didChangeValueForKey:@"childNodes"];
    [self didChangeValueForKey:@"countOfChildNodes"];
    [self didChangeValueForKey:@"nodeIsLeaf"];
}
Run Code Online (Sandbox Code Playgroud)

cocoa binding objective-c nsoutlineview nstreecontroller

8
推荐指数
1
解决办法
1702
查看次数

如何将NSTreeController的子项绑定到核心数据中,这些数据被命令为多关系?

Apple在Lion的Core Data中引入了许多关系.我创建了一个名为TreeNode的实体,它具有1:1对象关系,1:1父关系和有序到多关系的子关系.

然后我有一个NSTreeController子项密钥路径设置为TreeNode.children.运行应用程序仅显示第一级元素.所以孩子们没有工作.由于孩子是有序的多关系,相应的班级有NSOrderedSet孩子.我添加了一个自定义方法

- (NSArray *) childrenArray {
  return [children array];
}
Run Code Online (Sandbox Code Playgroud)

到TreeNode工作.我找不到任何有关该主题的文档.绑定NSTreeController到有序多对多关系时,它真的是走的路吗?提前致谢.

cocoa core-data nstreecontroller cocoa-bindings

8
推荐指数
1
解决办法
1481
查看次数

将NSTreeController与NSOutlineView一起使用

我正在尝试(不成功)构建一个TreeController控制的NSOutlineView.我已经阅读了很多教程,但他们都在开始之前预先加载了数据,这对我来说不起作用.

我有一个简单的设备类:

import Cocoa
class Device: NSObject {
    let name : String
    var children = [Service]()
    var serviceNo = 1
    var count = 0

    init(name: String){
        self.name = name
    }

    func addService(serviceName: String){
        let serv = "\(serviceName) # \(serviceNo)"
        children.append(Service(name: serv))
        serviceNo += 1
        count = children.count
    }

    func isLeaf() -> Bool {
        return children.count < 1
    }
}
Run Code Online (Sandbox Code Playgroud)

我还有一个更简单的"服务"课程:

import Cocoa
class Service: NSObject {

    let name: String

    init(name: String){
        self.name = name
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,我有ViewController:

class ViewController: NSViewController …
Run Code Online (Sandbox Code Playgroud)

macos nsoutlineview nstreecontroller swift

5
推荐指数
1
解决办法
2634
查看次数

NSTreeController基于瞬态isRoot异常获取谓词

我的基于文档的Cocoa应用程序使用绑定到文档的Core Data存储的NSOutlineView/NSTreeController组合.我的NSTreeController有fetch谓词isRoot == YES. isRoot是一个临时布尔属性,默认值为NO.我的根模型的awakeFromInsert调用:

[self setIsRoot:[NSNumber numberWithBool:YES]];

我能够很好地将对象添加到层次结构中,但是当我尝试加载刚刚保存的文档时,我得到一个例外:

[<NSDictionaryMapNode 0x1001a8190> valueForUndefinedKey:]: this class is not key value coding-compliant for the key isRoot.

我可以解决这个异常并成功加载一个新保存的文件,如果我isRoot在xcdatamodel中将属性更改为非瞬态,但基于我对瞬态标志的理解它不应该导致问题,这实际上不是应该持久化的数据类型.

我也尝试-isRoot在NSManagedObject子类中实现以返回适当的固定值,以及在其中进行相同的setIsRoot:调用awakeFromFetch,两者都无济于事.

还有其他一些我遗漏的微妙之处吗?我无法想象fetch谓词不支持瞬态属性.我不太了解Core Data的内部工作原理,但它似乎很有趣,它试图查找isRoot特定于商店的类而不是我的NSManagedObject子类.

cocoa core-data nstreecontroller

2
推荐指数
1
解决办法
1275
查看次数

如何动态更新 NSTreeController 和 NSOutlineView?

当一个 outlineViewItem 展开时 -

 (void) outlineViewItemDidExpand:(NSNotification *)notification
Run Code Online (Sandbox Code Playgroud)

-,我能够成功地向 TreeController 添加一个对象(日志语句在层次结构的正确位置显示新添加的对象),但 OutlineView/UI 没有更新以反映该插入。

没用,我用过

  • [self.outlineView reloadItem:nil reloadChildren:YES],

  • [self.outlineView reloadData], 乃至

  • [self.outlineView setHidden:YES] 然后
    [self.outlineView setHidden:NO]

尝试强制重新加载结构。

这一切都是在 Objective-C 中以编程方式完成的。

macos cocoa objective-c nsoutlineview nstreecontroller

0
推荐指数
1
解决办法
710
查看次数