NSPopover内的NSTableview与独立版不同 [英] NSTableview inside NSPopover looks different as standalone

查看:116
本文介绍了NSPopover内的NSTableview与独立版不同的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I created a class ListView, that is a very simple Tableview.

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

If I instantiate it with IB everything looks fine. The same if I instantiate it programmatically.

如果我在 NSPopover 中以编程方式对其进行实例化,则表的每一行都会得到浅灰色背景.

If I instantiate it programmatically inside a NSPopover, I get a light grey background for every row of my table.

这是哪里来的?

代码在这里:

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

推荐答案

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

I recently came across this problem and couldn't find a satisfying solution.

我现在设法做到的方法是将 NSTableView 包裹在 NSEffectView 内,并将状态设置为非活动,如前所述此处:> https://christiantietze.de/posts/2017/06/nssplitviewcontroller-visual-effects/(我已经在IB中做到了)

The way I managed to do it now is wrapping the NSTableView inside an NSEffectView and set the state to inactive, view as pointed out here: https://christiantietze.de/posts/2017/06/nssplitviewcontroller-visual-effects/ (I have done this in IB)

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

It does work fine for the normal/aqua appearance. Sadly in the dark appearance the TableView section headers are transparent for some reason. I'm curious to see how it will look on Mojave with the system wide dark mode.

这篇关于NSPopover内的NSTableview与独立版不同的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆