代码中仅缺少NSOutlineView的披露按钮

时间:2016-08-09 05:36:28

标签: cocoa nsoutlineview

我正在尝试在Swift游乐场中构建仅代码的NSOutlineView,而我正试图显示披露按钮。

目前结果如下:

NSOutline missing discloure buttons

但我期待更像这样的事情:

Expected

这是我到目前为止的代码。

// Requires XCode 7.3.1
import Cocoa
import XCPlayground

let FILENAME_COLUMN = "FileName2"

public class Node
{
    init (_ description: String, _ children: [Node]) {
        self.description = description
        self.children = children
    }

    convenience init (_ description: String) {
        self.init(description, [])
    }

    public var children : [Node] = []
    public var description: String = ""
}

func makeOutline() -> NSOutlineView {

    let outline = NSOutlineView(frame: NSMakeRect(0, 0, 250, 150))

    let fileNameColumn = NSTableColumn(identifier: FILENAME_COLUMN)
    fileNameColumn.title = "File Name"
    fileNameColumn.width = 200

    outline.addTableColumn(fileNameColumn)
    outline.selectionHighlightStyle = .Regular
    return outline
}

func makeOutlineDelegate() -> NSOutlineViewDelegate {

    class OutlineViewDelegate : NSObject, NSOutlineViewDelegate {

        @objc func outlineView(outlineView: NSOutlineView, shouldShowOutlineCellForItem item: AnyObject) -> Bool {
            return true
        }

        @objc func outlineView(outlineView: NSOutlineView, shouldExpandItem item: AnyObject) -> Bool {
            return true;
        }

        @objc func outlineView(outlineView: NSOutlineView, viewForTableColumn tableColumn: NSTableColumn?, item: AnyObject) -> NSView? {

            let columnIdentifier = tableColumn!.identifier

            if let recycledCell = outlineView.makeViewWithIdentifier(columnIdentifier, owner: self) as? NSTableCellView {
                return recycledCell
            }

            let newCell = NSTableCellView(frame: NSMakeRect(0, 0, 150, outlineView.rowHeight))


            newCell.identifier = columnIdentifier
            newCell.autoresizesSubviews = true

            let imageField = NSImageView(frame: NSMakeRect(0, 0, 150, outlineView.rowHeight))
            newCell.addSubview(imageField)
            newCell.imageView = imageField

            let textField = NSTextField(frame: NSMakeRect(0, 0, 150, outlineView.rowHeight))
            newCell.addSubview(textField)
            newCell.textField = textField
            textField.bordered = false
            textField.drawsBackground = false
            textField.bind(NSValueBinding,
                           toObject: newCell,
                           withKeyPath: "objectValue",
                           options: nil)

            return newCell
        }
    }

    return OutlineViewDelegate()
}

func makeOutlineDataSource(store: [Node]) -> NSOutlineViewDataSource {


    class OutlineViewDataSource : NSObject, NSOutlineViewDataSource {

        var store : [Node]

        init(store:[Node]) {
            self.store = store
        }

        @objc func outlineView(outlineView: NSOutlineView, isItemExpandable item: AnyObject) -> Bool {

            if item is [Node] {
                return true
            }

            if let node = item as? Node {
                return node.children.count > 0
            }

            return true
        }

        @objc func outlineView(outlineView: NSOutlineView, objectValueForTableColumn tableColumn: NSTableColumn?, byItem item: AnyObject?) -> AnyObject? {

            if let node = item as? Node {
                return node.description
            }

            return nil
        }

        @objc func outlineView(outlineView: NSOutlineView, child index: Int, ofItem item: AnyObject?) -> AnyObject {

            if (item == nil) {
                return store[index]
            }

            if let nodeArray = item as? [Node] {
                return nodeArray[index]
            }

            if let node = item as? Node {
                return node.children[index]
            }

            return Node("WRONG")
        }

        @objc func outlineView(outlineView: NSOutlineView, numberOfChildrenOfItem item: AnyObject?) -> Int {

            if (item == nil) {
                return store.count;
            }

            if let nodeArray = item as? [Node] {
                return nodeArray.count
            }

            if let node = item as? Node {
                return node.children.count
            }

            return 0
        }

    }

    return OutlineViewDataSource(store: store)

}

let store = [
    Node("Dev", [
        Node("svc_sql_dev"),
        Node("svc_app_dev")
        ]),
    Node("Test",[
        Node("svc_sql_test"),
        Node("svc_app_test")
        ]),
    Node("UAT",[
        Node("svc_sql_uat"),
        Node("svc_app_uat")
        ]),
    Node("Prod",[
        Node("svc_sql_prod"),
        Node("svc_app_prod")
        ])
]

let outline = makeOutline()
let dataSource = makeOutlineDataSource(store)
let outlineDelegate = makeOutlineDelegate()
outline.setDataSource(dataSource)
outline.setDelegate(outlineDelegate)

outline.expandItem(outline.itemAtRow(4), expandChildren: true)
outline.expandItem(outline.itemAtRow(3), expandChildren: true)
outline.expandItem(outline.itemAtRow(2), expandChildren: true)
outline.expandItem(outline.itemAtRow(0), expandChildren: true)

let container = NSScrollView(
    frame: NSMakeRect(0, 0, 400, 160))

container.documentView = outline
container.hasVerticalScroller = true;

//dispatch_async(dispatch_get_main_queue(), {
//    outline.expandItem(nil, expandChildren: true)
//})

XCPlaygroundPage.currentPage.liveView = container

更新(使用解决方案)

需要将列设置为outlineColumn

outline.outlineTableColumn = fileNameColumn

0 个答案:

没有答案