其实周末也不能懈怠啊
实现类似于QQ好友展开列表,发现Mac上实现还是很麻烦的
1.拖入SourceList, 创建根叶模型
RootModel.swift
class RootModel: NSObject {
var name = ""
// 是否是子节点
var isLeaf = false
// children为子节点数组,也可以起其他名称
var children = [LeafModel]()
}
LeafModel.swift
class LeafModel: NSObject {
var leafName = ""
var hasChildren = false
init(name: String) {
self.leafName = name
}
}
2.添加数据
ViewController.swift
func addData() {
let leaf1 = LeafModel(name: "艾希")
let leaf2 = LeafModel(name: "易")
let leaf3 = LeafModel(name: "泰达米尔")
let root1 = RootModel()
root1.name = "LOL"
root1.children = [leaf1, leaf2, leaf3]
let leaf4 = LeafModel(name: "北京")
let leaf5 = LeafModel(name: "上海")
let leaf6 = LeafModel(name: "深圳")
let root2 = RootModel()
root2.name = "城市"
root2.children = [leaf4, leaf5, leaf6]
rootArray = [root1, root2]
self.outlineView .reloadData()
}
查看的demo并不需要reloadData一下,但是这样写逻辑是对的,以后再碰到再看看
3.连接Delegate和DataSource,实现代理和数据源
ViewController.swift
// MARK: DataSource
extension ViewController {
// item的数量
func outlineView(_ outlineView: NSOutlineView, numberOfChildrenOfItem item: Any?) -> Int {
if let model = item as? RootModel {
return model.children.count
} else {
return rootArray.count
}
}
// 是否能够展开
func outlineView(_ outlineView: NSOutlineView, isItemExpandable item: Any) -> Bool {
return item is RootModel
}
// item的数据源
func outlineView(_ outlineView: NSOutlineView, child index: Int, ofItem item: Any?) -> Any {
if let model = item as? RootModel {
return model.children[index]
} else {
return rootArray[index]
}
}
}
// MARK: Delegate
extension ViewController {
// itemView的显示,相当于iOS中的cell
func outlineView(_ outlineView: NSOutlineView, viewFor tableColumn: NSTableColumn?, item: Any) -> NSView? {
var cell: NSTableCellView?
if item is RootModel {
let model = item as? RootModel
cell = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "HeaderCell"), owner: self) as? NSTableCellView
cell?.textField?.stringValue = model?.name ?? ""
} else {
let model = item as? LeafModel
cell = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "DataCell"), owner: self) as? NSTableCellView
cell?.textField?.stringValue = model?.leafName ?? ""
}
return cell
}
}
效果:

4.默认展开
ViewController.swift
outlineView.expandItem(nil, expandChildren: true)
网友评论