Динамически заполняемое меню NSPopUpButtonCell в NSOutlineView

Я работаю с NSOutlineView, который имеет два столбца. Мой dataSource предоставляет представление схемы с деревом элементов пользовательского класса, который представляет типы файлов (то есть вы инициализируете его с помощью UTI). Первый столбец — это отображаемое имя типа файла (например, «Исходный код», «Документ NIB Interface Builder» и т. д.). Второй столбец — это NSPopUpButtonCell, который должен позволить пользователю выбрать обработчик для данного типа документа (подумайте о панели настроек Xcode «Типы файлов», и вы в значительной степени там).

Я могу сгенерировать NSMenu для заданного элемента в дереве, заполненного параметрами на основе записей базы данных Launch Services для UTI, дополненного значком соответствующего приложения и т. д. На самом деле прекрасно работает само меню, заполняемое способом NSPopUpButtonCellWillPopUpNotification.

Проблема в том, что, как я ни старался, ячейка, когда меню не всплывает, всегда содержит ровно одну из двух вещей: либо пустую строку, либо текст по умолчанию для ячейки, первый, если результат -handlerName для элемента (атрибут, назначенный столбцу) не равен nil, в противном случае последний.

Более того, я вручную вызываю -selectItem: на экземпляре NSPopUpButtonCell, что кажется неправильным. Напротив, левый столбец, который представляет собой просто NSTextFieldCell, все просто работает (хотя все, что ему нужно сделать, это прочитать значение из элемента и представить его).

(Отказ от ответственности: я новичок в Cocoa UI; я знаю Objective-C и множество других языков программирования, но у меня нет большого опыта создания пользовательских интерфейсов для Mac OS X, так что будьте осторожны).


person Mo.    schedule 24.04.2010    source источник


Ответы (1)


Так как я также борюсь с layoutViews и popUpButtons, мне бы очень хотелось узнать ответ на этот и многие другие вопросы. Боюсь, я ничем не могу вам помочь, но одна вещь бросилась мне в глаза:

Я могу сгенерировать NSMenu для данного элемента в дереве

За последние мучительные недели я усвоил одну вещь: при работе с NSTreeController и источником данных всегда предоставляйте NSTreeNodes, устанавливающие ваш реальный объект (в данном случае NSMenu) в качестве представляемого объекта.

person Elise van Looij    schedule 05.04.2011