Mac Dev Part 3 - NSOutlineView

2019-03-04  本文已影响0人  遇见Miu

其实周末也不能懈怠啊

实现类似于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
    }
}


效果:


效果图.gif

4.默认展开

ViewController.swift

outlineView.expandItem(nil, expandChildren: true)
上一篇 下一篇

猜你喜欢

热点阅读