Редактируемые NSTextFields с переменной высотой в строках NSTableView в приложении MacOS - PullRequest
0 голосов
/ 29 января 2019

Xcode 10.1, Swift 4.2, macOS 10.14.2

Я пытаюсь создать простое приложение со списком дел для macOS, где есть ряд строк NSTableView и внутрикаждый из них NSTextField.Каждое поле является элементом дел.Я хочу, чтобы строки NSTableView расширялись, чтобы соответствовать размеру текста в каждом NSTextField.

У меня есть все следующие рабочие параметры:

  1. Установка текста вNSTextField расширяет строку NSTableView по мере необходимости.В моей раскадровке установлены автоматические ограничения макета.
  2. Использование tableView.reloadData(forRowIndexes: ..., columnIndexes: ...) устанавливает текст и корректно изменяет размер строки таблицы.reloadData works Но выполнение tableView.reloadData() всегда сбрасывает каждую NSTextField в одну строку текста, как показано здесь: reloadData fails Интересно, если вы нажмете на NSTextField послеперезагружая всю таблицу, поле снова изменяет размеры, чтобы соответствовать его содержимому: Clicking a row fixes it

Я полагаю, что я установил все соответствующие ограничения автоматического размещения на моем NSTextField, и яЯ использую собственный подкласс для него (из полезного ответа здесь ):

class FancyField: NSTextField{
  override var intrinsicContentSize: NSSize {
    // Guard the cell exists and wraps
    guard let cell = self.cell, cell.wraps else {return super.intrinsicContentSize}

    // Use intrinsic width to jibe with autolayout
    let width = super.intrinsicContentSize.width

    // Set the frame height to a reasonable number
    self.frame.size.height = 150.0

    // Calcuate height
    let height = cell.cellSize(forBounds: self.frame).height

    return NSMakeSize(width, height)
  }

  override func textDidChange(_ notification: Notification) {
    super.textDidChange(notification)
    super.invalidateIntrinsicContentSize()
  }
}

e Вот пример проекта: https://d.pr/f/90CTEh

Я в растерянности относительно того, что еще я могу попробовать.Есть идеи?

1 Ответ

0 голосов
/ 09 февраля 2019

Я думаю, что есть некоторые основные проблемы с ограничениями в конструкторе интерфейсов.Изменение размера окна делает все шатким.Также вы должны позвонить validateEditing() в textDidChange(forBounds:) в вашем FancyField классе.Я создал пример проекта, который делает то, что вы хотите на Github

Напишите комментарий, если у вас есть какие-либо проблемы с ним.

Подумав немного об этом, подумал ядобавил бы код здесь.Единственное, что действительно должно работать, - это обновление NSTextField при обновлении «Задач».Ниже приведен код, необходимый для NSTextField.

public class DynamicTextField: NSTextField {
   public override var intrinsicContentSize: NSSize {
      if cell!.wraps {
         let fictionalBounds = NSRect(x: bounds.minX, y: bounds.minY, width: bounds.width, height: CGFloat.greatestFiniteMagnitude)
         return cell!.cellSize(forBounds: fictionalBounds)
      } else {
         return super.intrinsicContentSize
      }
   }

   public override func textDidChange(_ notification: Notification) {
      super.textDidChange(notification)

      if cell!.wraps {
         validatingEditing()
         invalidateIntrinsicContentSize()
      }
   }
}

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...