NSBrowser setRowHeight, не поддерживается для браузеров с матричными делегатами - PullRequest
2 голосов
/ 04 марта 2012

У меня есть NSBrowser и я пытаюсь использовать setRowHeight, но я получаю ошибку:

"setRowHeight: не поддерживается для браузеров с матричными делегатами."

Я действительно не понимаю, что это значит, и если бы кто-то мог мне помочь, либо рассказав мне, как это исправить, либо просто представив матричный делегат, это было бы очень признательно.

Ответы [ 2 ]

1 голос
/ 07 марта 2012

Делегат - это вспомогательный объект, о котором вы сообщаете экземпляру NSBrowser, либо используя код -setDelegate:, либо подключая выход делегата в IB (редактор NIB).Он обычно используется для заполнения данных браузера, программного определения параметров макета и т. Д.

Если в вашем экземпляре NSBrowser назначен делегат, от вас ожидают (требуется), чтобы указывать высоту строки с помощью метода делегата:

- (CGFloat)browser:(NSBrowser *)browser heightOfRow:(NSInteger)row inColumn:(NSInteger)columnIndex

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

0 голосов
/ 10 июня 2016

A NSBrowser создает один экземпляр NSMatrix на столбец. Сам браузер управляет только столбцами и оставляет управление строками полностью матрицами. Матрицы отображают объекты ячеек (NSCell или их подклассы). Ячейка - это простой отображаемый объект, который ничего не знает, кроме как рисовать себя. В отличие от вида (NSView и подклассов), он никогда не управляет собственным контекстом рисования, он также не принадлежит окну (и, следовательно, никогда не будет напрямую обращаться к контексту рисования окна), и он ничего не знает о «виде» иерархия "(суперпредставления, подпредставления, порядок просмотра, ограничения и т. д.), он просто управляет некоторыми свойствами, некоторым состоянием и знает, как рисовать себя в предоставленном контексте рисования.

Если ваш делегат работает с элементами (в документах говорится о " методах делегатов элементов "), разработчики NSBrowser считают, что вряд ли вы когда-нибудь захотите иметь дело с Матрицы напрямую, поэтому браузер будет контролировать все аспекты отображения для вас. От вас требуется только раздавать предметы (в основном произвольные объекты) в ваш делегат и отвечать на вопросы о них, применяя различные методы делегата. Например: что такое корневой элемент? Является ли предмет x листовым или имеет детей? Сколько у него детей? Какой дочерний номер n предмета x? Какой экранный объект (строку, изображение и т. Д.) Я должен использовать для отображения этого элемента?

Если вы не работаете с элементами, вам придется работать непосредственно с ячейками (NSBrowserCell, подкласс NSCell), которые принадлежат матрице и будут отображаться. В этом случае вас называют « делегатом матрицы браузера ». Это означает, что браузер только спросит вас, сколько строк в столбце, настроит для вас матрицу с ячейками для этого столбца и, наконец, передаст каждую ячейку вашему делегату один раз, чтобы вы могли сделать с ней что-то значимое, например, заполните его отображаемым содержимым, в противном случае ячейка будет просто пустой, и научите всему, что должен знать браузер (например, задайте свойство leaf).

Поскольку основанный на матрице делегат должен иметь дело с ячейками напрямую, он также может иметь дело и с матрицами напрямую, и фактически это именно то, что вы должны сделать здесь. Например. если вы хотите, чтобы все строки вашего браузера имели высоту 50 точек, реализуйте следующий метод делегата NSBrowser:

- (void)browser:(NSBrowser *)browser
    didChangeLastColumn:(NSInteger)oldLastColumn
    toColumn:(NSInteger)column
{
    NSMatrix * matrix = [browser matrixInColumn:column];
    CGSize cellSize = [matrix cellSize];
    if (cellSize.height != 50) {
        cellSize.height = 50;
        matrix.cellSize = cellSize;
        [matrix sizeToCells];
    }
}

Каждая матрица, созданная браузером, передается этому методу хотя бы один раз, прежде чем она отображается на экране. В случае, если матрица уже не использует высоту ячейки 50, мы изменяем это и, наконец, указываем матрице переразметку; это важно, так как в противном случае он не пересчитает свою общую высоту. if только для того, чтобы мы не звонили sizeToCells чаще, чем необходимо, поскольку этот вызов может быть довольно дорогим. В этом примере все столбцы имеют одинаковую высоту строки, но, конечно, вы можете установить различную высоту строки для столбца.

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