Как выровнять объект в NSTableCellView

#swift #xcode

#swift #xcode

Вопрос:

Я пытаюсь расположить NSPopUpButton вертикально сверху в ячейке таблицы — безуспешно. Он остается центрированным по вертикали:

Изображение таблицы со quot;смещеннымиquot; всплывающими окнами

Код, который возвращает NSPopUpButtons:

 extension ViewController:NSTableViewDataSource, NSTableViewDelegate{


func tableViewColumnDidResize(_ notification: Notification) {}


func tableView(_ tableView: NSTableView, heightOfRow row: Int) -> CGFloat {}


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

func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView?{

    if tableColumn?.identifier.rawValue == "value" {

        

    } else if (tableColumn?.identifier.rawValue == "type") {

        let typePopUp = NSPopUpButton()

        typePopUp.addItems(withTitles:["Data", "String", "Number", "Boolean"])
        typePopUp.isBordered = false

        return typePopUp

    } else {}
}
  

}

Может кто-нибудь указать мне правильное направление?

Комментарии:

1. Использовать маску автоматического изменения размера?

2. Используете ли вы автозапуск в InterfaceBuilder? Как вы позиционируете элементы управления?

3. Я отключил автозапуск, но идентификатор не повлиял. Если я применяю ограничение к всплывающему окну, это выдает ошибку времени выполнения Error: [Layout] Не удается одновременно выполнить ограничения: ( «<NSLayoutConstraint:0x600002128fa0 NSPopUpButton: 0x600003705980 ‘Data’.height == 17 (активный)>», «<NSLayoutConstraint: 0x60000212a6c0 ‘NSView-Encapsulated-Layout-Height’ NSPopUpButton :0x600003705980’Data’.height == 52 (активный)>» ) Код: NSLayoutConstraint.activate([ typePopUp.heightAnchor.constraint(equalToConstant: 17) ])

Ответ №1:

Я предлагаю вам создать подкласс ячейки таблицы для этого столбца, встроить кнопку в NSView и добавить функцию «customizeCell» в подкласс. Эта функция может определить фактическую высоту строки таблицы при вызове из делегата, соответствующим образом изменить размер представления и расположить кнопку так, как вам нравится, с помощью autolayout относительно вашего представления.

Кроме того, хотя я не думаю, что это является причиной вашей проблемы, если вы не исключили это из своего вопроса для краткости, вы не используете «makeView».

Обычно,

 func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView?{
  

получает свою ячейку из:

 let vw = tableView.makeView(withIdentifier: tableColumn!.identifier, owner: self)
  

Cocoa создает ячейку из кончика и ставит ее в очередь для повторного использования (что, вероятно, имеет значение, только если ваша таблица довольно длинная)

Надеюсь, здесь я на верном пути.

Комментарии:

1. Спасибо, Рон, подклассы / встраивание сделали свое дело! Отлично работает с makeView. Это было именно то, что мне было нужно. Приветствую, Тим