Мне удалось реализовать это в Swift 3 (с помощью this отличный совет и this и this SO ответ):
Убедитесь, что ячейка представления таблицы в NSTableView
имеет подключение делегата к вашему контроллеру подкласса/представления, который принимает протокол NSTextFieldDelegate
.
также дать ему эти ограничения, чтобы убедиться, что она изменяет размер в зависимости от высоты строки:
При использовании делегата этот код:
var editedString: String? = nil
var textCellForHeight: NSTextFieldCell = NSTextFieldCell.init()
func control(_ control: NSControl, textShouldBeginEditing fieldEditor: NSText) -> Bool {
editedString = fieldEditor.string ?? ""
return true
}
func control(_ control: NSControl, textShouldEndEditing fieldEditor: NSText) -> Bool {
editedString = nil
return true
}
func control(_ control: NSControl, textView: NSTextView, doCommandBy commandSelector: Selector) -> Bool {
if commandSelector == #selector(insertNewline(_:)) {
textView.insertNewlineIgnoringFieldEditor(self)
editedString = textView.string ?? ""
//The NSAnimationContext lines get rid of the animation that normally happens when the height changes
NSAnimationContext.beginGrouping()
NSAnimationContext.current().duration = 0
myTableView.noteHeightOfRows(withIndexesChanged: IndexSet.init(integer: selected))
NSAnimationContext.endGrouping()
myTable.needsDisplay = true
return true
}
return false
}
func tableView(_ tableView: NSTableView, heightOfRow row: Int) -> CGFloat {
if let temp = editedString { //we know it’s currently being edited if it’s not nil
textCellForHeight.stringValue = temp
//in my case, there was a specific table column that I knew would be edited
//you might need to decide on the column width another way.
let column = myTable.tableColumns[myTable.column(withIdentifier: “TheColumnThatsBeingEdited”)]
let frame: NSRect = NSMakeRect(0, 0, column.width, CGFloat.greatestFiniteMagnitude)
return textCellForHeight.cellSize(forBounds: frame).height
}
return yourStandardHeightCGFloat
}
Благодаря кен, это огромный Помогите. Я реализовал -tableView: heightOfRow: но у меня возникают проблемы с мониторингом текстовых просмотров. Игра с функциями autoLayout в IB дала мне расширяющийся текст, который я получил после (спасибо за это - гораздо более чистое решение, чем я изначально), но у меня проблемы с просмотром текстового представления. Можете ли вы подробнее рассказать об использовании noteHeighOfRowsWithIndexesChanged: и NSViewFrameDidChangeNotification? – user3932488
Какой аспект дает вам проблемы? Каждый раз, когда вы добавляете текстовый вид в таблицу, вы добавляете свой объект контроллера в качестве наблюдателя 'NSViewFrameDidChangeNotification' в' [NSNotificationCenter defaultCenter] 'с текстовым представлением объекта публикации. Затем в вашем коде обработки уведомлений вы просматриваете, какая строка соответствует представлению, чей фрейм изменился («объект» уведомления), используя '- [NSTableView rowForView:]'. Затем вы вызываете '-noteHeightOfRowsWithIndexesChanged:' в представлении таблицы, передавая индексный набор, содержащий индекс строки. Прекратите наблюдать, когда вы удаляете представление. –
Хорошо, я не думаю, что понимаю это правильно. Я реализовал -noteHeightofRowsWithIndexesChanged: но похоже, что он не вызван. Нужно ли инициализировать NSNotificationCentre в моем AppDelegate? – user3932488