NSPopover内部的NSTableview看起来与众不同

时间:2017-11-26 20:56:18

标签: swift macos cocoa nstableview nspopover

我创建了一个类ListView,这是一个非常简单的Tableview。

如果我用IB实例化它,一切看起来都很好。 如果我以编程方式实例化它也是一样。

如果我在NSPopover内以编程方式对其进行实例化,那么我的每一行都会得到浅灰色背景。

enter image description here

这是从哪里来的?

这里是代码:

class ViewController: NSViewController {
    let popover = NSPopover()

    @IBOutlet weak var label: NSTextField!
    @IBAction func bu1(_ sender: Any) { 
        popover.show(relativeTo: label.visibleRect, of: label, preferredEdge: NSRectEdge.maxY)
    }

    override func viewDidLoad() { 
        super.viewDidLoad()

        let scrollListView = NSScrollView()
        let listView = ListView(frame: NSRect(x:100, y: 100, width: 100, height: 100))
        scrollListView.documentView = listView

        let viewController = NSViewController()
        viewController.view = scrollListView

        popover.appearance = NSAppearance(named: NSAppearance.Name.vibrantLight)
        popover.animates = false
        popover.contentViewController = viewController
    }
}

class ListView: NSTableView, NSTableViewDataSource, NSTableViewDelegate { 
    private var list = ["Tom","Jack","Susi"]

    required init?(coder: NSCoder) { 
        super.init(coder: coder)
        setup()
    }

    override init(frame frameRect: NSRect) { 
        super.init(frame: frameRect)
        setup()
    }

    private func setup() { 
        selectionHighlightStyle = NSTableView.SelectionHighlightStyle.regular
        rowSizeStyle = NSTableView.RowSizeStyle.small
        intercellSpacing = NSMakeSize(10.0, 0.0)
        headerView = nil
        target = self

        backgroundColor = NSColor.white
        for column in tableColumns { 
            removeTableColumn(column)
        }
        let column1 = NSTableColumn(identifier: NSUserInterfaceItemIdentifier(rawValue: "text"))
        column1.isEditable = false
        column1.width = 200
        addTableColumn(column1)

        delegate = self
        dataSource = self

        self.reloadData()
    }

    func numberOfRows(in tableView: NSTableView) -> Int { 
        return list.count
    }

    func tableView(_ tableView: NSTableView, rowViewForRow row: Int) -> NSTableRowView? { 
        return NSTableRowView()
    }

    func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
        var cellView = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "MyView"), owner: self) as? NSTableCellView
        if cellView == nil { 
            cellView = NSTableCellView(frame: NSZeroRect)
            let textField = NSTextField(frame: NSZeroRect)
            textField.isBezeled = false
            textField.drawsBackground = false
            textField.isEditable = false
            textField.isSelectable = false
            cellView!.addSubview(textField)
            cellView!.textField = textField
            cellView!.identifier = NSUserInterfaceItemIdentifier(rawValue: "MyView")
        }
        cellView!.textField!.stringValue = list[row]

        return cellView
    }
}

2 个答案:

答案 0 :(得分:1)

我最近遇到了这个问题,找不到令人满意的解决方案。

我现在设法做到的是将NSTableView包裹在NSEffectView内,并将状态设置为非活动,此处指出:{{3} }(我已经在IB中做到了这一点)

对于正常/浅绿色外观确实不错。可悲的是,出于某种原因,在黑暗外观中,TableView节标题是透明的。我很好奇它在系统范围内的黑暗模式下在Mojave上的外观。

答案 1 :(得分:0)

我有同样的问题。事实上,这个问题出现在我放在NSPopover中的所有项目中。 将外观设置为浅绿色popover.appearance = NSAppearance(named: NSAppearance.Name.aqua),可以解决问题。 但是现在,当您在明暗模式之间切换时,弹出窗口不会更新......

相关问题