美文网首页开发点滴iOS之MAC端开发iOS Developer
Mac OSX 开发基础控件学习之 NSOutlineView

Mac OSX 开发基础控件学习之 NSOutlineView

作者: 代码行者 | 来源:发表于2017-07-10 13:57 被阅读1596次
NSOutlineView-feature.png 在开发基于osx的Application的过程中,当我们需要显示一组列表结构的数据时,比较容易想到的控件是NSTableView;但如果你显示的数据有层级结构时,NSTableView就会面临一个问题:因为在osx中,NSTableView没有分组功能( sections)
因为在cocoa 中提供了另一个控件供满足我们的需求NSOutlineView它是继承自NSTableView的子类,是Mac OSX Application常用的控件之一,与NSTableView相似,NSOutlineView也使用行和列来显示内容,但所不同的是NSOutlineView使用具有层级的数据结构
下面我们通过一个示例(你也可以从这里Demo下载工程,但更推荐自己一步一步创建工程并实现功能)来简单学习一下怎样使用NSOutlineView显示带有层级结构的数据内容
创建osx项目工程,并搭建UI界面,大致效果如下图:
UI界面
  • 从控件库中,拖动Source List 控件(NSOutlineView)storyboard中,并添加约束。
初始化设置NSOutlineView
初始化设置
  • 本示例中,列数为默认值1: Columns = 1
  • 设置行的交替显示效果:enable Alternating Rows
  • 设置层级缩进:Indentation = 16
运行效果
空白效果
这是一个空白的NSOutlineView效果,接下来,我们要添加Data model数据模型,并设置DataSourceDelegate
Data Model 数据模型

NSOutlineViewData modelNSTableView有些不同,因为NSOutlineView显示层级结构,因此Data model中要能够表示出这种数据的层级来:root node -> leaf node

  • 在工程中添加RootModel Class

    Root Model
    Root Model 中,添加两个属性:nameisLeaf
    name 和isLeaf
  • 同样的操作,再添加Leaf Model Class

    LeafModel Class
  • RootModel 中,添加子节点数组属性

    children
ViewController 中初始化模型数据
setup mode
设置NSOutlineView的DataSourceDelegate
Data Source 和 Delegate
ViewController 实现数据源代理方法
ViewController 实现方法
  • NSOutlineView数据源方法调用顺序:numberOfChildrenOfItem->child index: Int ->isItemExpandable

  • cell 的重用:

   cell = outlineView.make(withIdentifier: "HeaderCell", owner: self) as? NSTableCellView
设置根节点cell的重用标识
cell = outlineView.make(withIdentifier: "DataCell", owner: self) as? NSTableCellView
设置子节点cell重用标识
最终运行效果
运行效果
One more thing
  • 设置展开所有节点或者某一节点
    设置展开指定节点
    1. 从storyboard中,将NSOutlineView连线到Viewcontroller,添加属性outlineView
  1. 在 viewDidAppear中,添加代码实现:
  // 展开所有节点
        outlineView.expandItem(nil, expandChildren: true)
        // 展开第一个节点
        // outlineView.expandItem(outlineView.item(atRow: 0), expandChildren: true)
        // 展开第二个节点
       //  outlineView.expandItem(outlineView.item(atRow: 1), expandChildren: true)
  • 效果如下:
展开效果
感谢阅读
  • 限于水平,难免有疏漏之处,各位可在评论中指出,共同学习讨论~

相关文章

网友评论

  • 心语风尚:reloaData好了
  • 心语风尚:空白 没有数据
  • lazy_developer:楼主 demo我下载了 但是好像有点问题 代理不走viewFor tableColumn:的方法 页面没有任何数据~
    代码行者:@LynnXYT 是这样的,包括tableView/CollectionView 也一样的逻辑,这点同iOS是相同的都是获取到数据才进行表格刷新
    LynnXYT:因为outlineView创建时机比你初始化数据源要早,简单解决方案是,初始化数据源之后 reloadData就好了
  • 3aaae3a4809c:作者大大, 这页显示乱码了
    代码行者:@laiqurufeng :pray:感谢告知,已修正:smile:
  • iWe:楼主,问一下网易云音乐左边的菜单使用的这个OutlineView还是用的NSTableVIew呀
    代码行者:@ripperhe :smile:感谢提醒,如果有收起或展开的效果,推荐优选OutlinView
    ripperhe:也可以是 NSCollectionView
    代码行者:@iWe 应该是OutlineView,因为在osx平台下tableview是没有Section的header和footer的,当然如果完全自定义,使用tableview也是可以实现的,不过比outlineView麻烦些
  • raymondcs:感谢大神!
    代码行者:@raymondcs :blush:学习进步
  • 努力心安:你好能加QQ聊下一下这个么 有一些疑问
    代码行者:@恩一我知道了 :sweat:不太用QQ,你可以再这里说一下,或者简信我
  • 九剑仙:最近在看macOS开发,帮助很大,每一个爱分享的程序员都是伟大的,么么哒
    努力心安:你好能加QQ聊下一下这个么 有一些疑问
    代码行者::blush: 很高兴文章内容对你有帮助

本文标题:Mac OSX 开发基础控件学习之 NSOutlineView

本文链接:https://www.haomeiwen.com/subject/wvlehxtx.html