swift - NSPopover 中的 NSTableview 看起来与独立的不同

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

最佳答案

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

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

它确实适用于普通/浅绿色外观。可悲的是,在黑暗的外观中,TableView 部分标题出于某种原因是透明的。我很好奇它在 Mojave 上使用系统范围的黑暗模式时会是什么样子。

关于swift - NSPopover 中的 NSTableview 看起来与独立的不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47500931/

相关文章:

ios - 删除 UILongPressGesture 默认 Action

ios - Swift:从照片库中获取资源,排除子类型

c++ - 如何在 mac 上使用 Ifstream codeblocks?

ios - 如何在 swift 3.0 中拖动和缩放 UIView 内的 UIImageView ?

ios - Swift NSTimer 将 userInfo 检索为 CGPoint

swift - 使用 Swift 使用 RecordID 检索 CloudKit 中的文本记录

java - 我如何与 mac 雪豹上的 java 更新作斗争

java - OS X 命令行 java 窗口出现

macos - NSTextField - 按下各个按键时的通知

cocoa - 在 NSTableView 中显示时图像模糊