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
чаще, чем необходимо, поскольку этот вызов может быть довольно дорогим. В этом примере все столбцы имеют одинаковую высоту строки, но, конечно, вы можете установить различную высоту строки для столбца.