Неверный начальный размер текстового поля (NSTableView)

У меня есть один столбец NSTableView (просмотр на основе) с TextField, Я использую autolayout и IB. Изменяются размеры большинства представлений в окне, в частности таблицы. Я помещаю атрибутивный текст в TextField. Если приложение запускается с шириной таблицы, меньшей или равной ширине TextField (как указано в IB), то все работает отлично. С другой стороны, если таблица изначально представлена ​​слишком широкой, то TextField слишком мал, и текст переносится, оставляя большое количество левого пространства. Изменение размера таблицы автоматически корректирует ширину TextField, пока приложение не будет перезапущено.

Внутри tableView viewForTableColumn я получаю NSTableCellView со стандартным makeViewWithIdentifier. Я попытался увеличить размер кадра, но это не дало эффекта. Кадр соответствует значениям из пера (как и следовало ожидать). Единственным ограничением является представление ячейки таблицы, которое вынуждает его увеличиваться и уменьшаться при изменении размера таблицы, НО только после того, как ширина таблицы сокращается пользователем.

Что-то происходит с Borded Scroll View, который содержит таблицу? Где бы я заставил NSTableCellView согласовать его ширину?

перед ручным изменением размера пользователем:до изменения размера пользователя

после изменения размера:после изменения размера пользователя

Спасибо...

6 ответов

Решение

Спасибо @macrene за полезные предложения. Большая часть моей отладки продолжала указывать на неисправный кончик, который действительно, кажется, имеет место.

Я не могу сказать "я понимаю проблему", но мое приложение работает. Кажется, есть некоторые проблемы с IB и наличием двух таблиц в одном представлении. Я создал тестовое приложение с одной таблицей, и все работало. Но я заметил некоторую "странность" при попытке изменить размер таблицы в IB. Иногда стол просто уходил в угол вне поля зрения.

Я вернулся к своему приложению и удалил таблицу с проблемами после попытки сопоставить ограничения с моим тестовым примером, так как IB не позволил мне ввести те же ограничения. Я должен был поставить стол с помощью инспектора размера. Я продолжал снимать все ограничения и играть с этим. Я наконец-то каким-то образом получил ограничения для входа.

Иерархия это:

Посмотреть
  Вид с прокруткой с рамкой - Вид таблицы
    Клип вид
      Табличное представление
        Столбец таблицы
          Вид ячейки таблицы (здесь нужны ограничения)
            Текстовое поле - ячейка табличного представления (здесь нужны ограничения)
            Ячейка текстового поля - текстовая ячейка

Я думаю, что IB запутывается, когда две таблицы в одном представлении. У него, безусловно, есть проблемы с настройкой размера и положения таблиц с помощью мыши.

Я думаю, что были также некоторые проблемы с autoresizingMask, Я попытался сопоставить эти настройки, отредактировав версию пера xml. Я что-то пропустил и наконец потерял терпение.

Я тоже столкнулся с той же проблемой.

Решением для меня было сделать столбец таблицы Width в инспекторе размера так же, как Width для Табличного Представления, потому что по некоторым причинам это было на 4pt меньше в моем случае.

Я использую два tableViews в том же (окно ->) вид без каких-либо проблем. Важно то, что у вас есть два разных соединителя, источники данных и - при желании - контроллеры массива. Вы даже можете создавать разные классы для каждого телевизора, если ваши телевизоры показывают разное содержимое.

ИЗМЕНЕНИЕ ИЗМЕНЕНИЯ: при использовании tableView, имейте в виду, что сверху вид прокрутки. Иерархия 1. ScrollView (внутри окна-> представление или любое другое представление, в котором находится табличное представление (!). 1.1. TableView (внутри scrollView.) Обратите внимание на IB-Inspector при настройке автоматического изменения размера для этих представлений. Они могут быть установленным внутри = посмотреть на себя и на внешний вид-> суперпредставление. Поиграйте с ним для a. sv b. tv -1. внутри, 2. снаружи, 3. вместе, смотрите красную каретку в предварительном просмотре. Используйте CMD r для предварительного просмотра Настройки в ИБ, затем измените размер окна, проверьте, какие изменения, это довольно легко понять.

Как вы могли видеть, вы можете установить ограничения для ширины ячейки в IB. Вы можете изменить это в своем коде.

В документации найдите "Советы и рекомендации по какао", то есть некоторые примеры проектов, и вы найдете несколько файлов с "TableViewVariableRowHeights...". Загрузите проекты. В используемой для загрузки папке вы найдете папку "TableViewVariableRowHeights". Нужный код легко найти. Удачи.

Ширина ячейки в табличном виде определяется шириной tableColumn, высотой, соответствующей высоте строки. Вы не можете изменить это только для конкретной клетки. Scrollview <-> Tableview Они используются вместе, но имеют очень разные задачи. Думайте о табличном представлении как о картине, которая показана в окне = scrollview. Если изображение слишком велико для окна, вы можете использовать свитки, чтобы сделать невидимые части видимыми. Табличные представления часто бывают большими...

Только что столкнулся с аналогичной проблемой с XCode 12.5. Ячейка в NSTableView, которая была в xib, созданном с помощью более ранней версии Xcode, начала заполнять только ~1/2 ширины столбца после внесения каких-либо изменений в xib, даже если это изменение не имело ничего общего с NSTableView. . Разница между рабочим xib и слегка измененным (изменил только одно измерение другого элемента управления на 1 пиксель) показала 27 изменений по всему документу, в основном небольшие изменения пикселей по всему xib. Никакая возня с ограничениями не исправит этого. По счастливой случайности я обнаружил, что каким-то образом «Стиль» TableView на панели «Атрибуты» изменился на «Автоматический», когда xib был изменен с помощью более поздней версии XCode. При изменении стиля на «Полная ширина» ячейка заполняет весь столбец.

Другие вопросы по тегам