NSPopover 内的 NSTableview 看起来与独立的不同

2024-04-03

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

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

如果我在一个内部以编程方式实例化它NSPopover,我的桌子的每一行都有浅灰色背景。

这是从哪里来的?

这里是代码:

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
    }
}

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

我现在设法做到的方法是包装NSTableView里面一个NSEffectView并将状态设置为非活动状态,查看此处指出的:https://christiantietze.de/posts/2017/06/nssplitviewcontroller-visual-effects/ https://christiantietze.de/posts/2017/06/nssplitviewcontroller-visual-effects/(我在IB中做过这个)

对于正常/浅绿色外观来说,它确实工作得很好。遗憾的是,在黑暗的外观中,TableView 部分标题由于某种原因是透明的。我很好奇它在 Mojave 上的全系统深色模式下会是什么样子。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NSPopover 内的 NSTableview 看起来与独立的不同 的相关文章

随机推荐