NSTableview внутри NSPopover выглядит иначе как автономный

Я создал класс 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
    }
}

person mica    schedule 26.11.2017    source источник
comment
Для меня это абсолютно необъяснимо. При повторной работе над этой проблемой эффект (серый фон или строки) исчез. Я счастлив, что сделал этот снимок экрана, иначе я бы подумал, что я зол ;-).   -  person mica    schedule 27.11.2017


Ответы (2)


Недавно я столкнулся с этой проблемой и не смог найти удовлетворительного решения.

Теперь мне удалось это сделать, заключив NSTableView в NSEffectView и установив состояние неактивно, как указано здесь: https://christiantietze.de/posts/2017/06/nssplitviewcontroller-visual-effects/ (я сделал это в IB)

Он отлично подходит для нормального / цвета морской волны. К сожалению, в темноте заголовки разделов TableView почему-то прозрачны. Мне любопытно посмотреть, как это будет выглядеть в Мохаве с общесистемным темным режимом.

person alexkaessner    schedule 27.07.2018

У меня точно такая же проблема. Фактически, проблема проявляется во всех элементах, которые я помещаю в NSPopover. Установка внешнего вида на голубой, popover.appearance = NSAppearance(named: NSAppearance.Name.aqua), немного решает проблему. Но теперь всплывающее окно не обновляется при переключении между светлым и темным режимами ...

person Loeribas    schedule 05.12.2017
comment
Вы нашли лучшее решение при использовании светлого или темного яркого внешнего вида? - person Daniel; 08.06.2018