#swift #xcode
#swift #xcode
Вопрос:
Я пытаюсь расположить NSPopUpButton вертикально сверху в ячейке таблицы — безуспешно. Он остается центрированным по вертикали:
Код, который возвращает 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. Это было именно то, что мне было нужно. Приветствую, Тим