#cocoa #binding #nstableview #add
#cocoa #привязка #nstableview #Добавить
Вопрос:
Я работаю над приложением с интерфейсом this (извините, язык голландский):
http://www.flickr.com/photos/pluueer/5756159100/
Функция добавления (вкл. четыре NSTextFields) в NSTableView когда-нибудь будут перенесены на лист, но пока это нормально. Я настроил привязки в соответствии с руководством (http://cocoadevcentral.com/articles/000080.php ), но в руководстве не указано, как добавлять строки так, как я хочу (просто добавляется пустая строка, которую вам нужно отредактировать в NSTableView).
У меня есть соединение между кнопкой «Voeg toe» (по-голландски «Добавить») и контроллером массива. Но после нажатия я получаю сообщение:
2011-05-28 23:37:56.149 Hop Calc[4345:a0f] -[__NSPlaceholderDictionary initWithObjects:forKeys:]: number of objects (0) not equal to number of keys (4)
Это имеет смысл, потому что я ничего не реализовал для добавления строк, но я просто не знаю как.
Ответ №1:
«Добавить строку в таблицу» — неправильный способ думать об этом. Ваша таблица представляет коллекцию, а контроллер предоставляет информацию в таблицу, выступая посредником между таблицей (представлением) и коллекцией (моделью). Поскольку вы упомянули привязки, коллекция, скорее всего, управляется NSArrayController. Итак, вы хотите добавить новый объект (того типа, которым управляет ваш контроллер массива) в массив содержимого контроллера массива.
Самый простой способ: подключите кнопку Добавить к действию -add: NSArrayController. Это добавит пустую строку.
Если вы хотите больше контроля, подключите кнопку Добавить к своему собственному пользовательскому действию в каком-либо контроллере. Это действие создаст экземпляр того, что представлено вашим контроллером массива, предварительно заполнит его (или что бы вы ни хотели сделать), затем, используя выход, который он поддерживает в вашем NSArrayController, вызовет метод array controller -AddObject: для добавления объекта (возможно, вызов a -rearrangeObjects, чтобы заставить контроллер массива повторно отсортировать его содержимое).
Комментарии:
1. Да, я имел в виду ArrayController 🙂 Я повторно ввел методы, которые у меня были до добавления привязок. Я могу сказать, что эти объекты добавлены в массив, но, похоже, я не могу принудительно обновить TableView. Как я могу это сделать?
2. Как вы добавляете объекты? Если вы добавляете их непосредственно в массив содержимого (например, не используя методы контроллера массива), вы «делаете это за спиной контроллера массива», поэтому он не видит обновления. Не добавляйте объекты непосредственно в массив, которым управляет контроллер массива; используйте nsarraycontroller’s -AddObject: (и соответствующую вставку / удаление), чтобы контроллер массива «знал», что его массив содержимого изменился.
3. То есть «принудительно обновить табличное представление» — это тоже неправильный способ думать об этом. Контроллер, как и должно быть, уведомит представление таблицы о возникновении изменений.
4. Да, я добавляю их прямо в массив. Уже читал, что это находится за задней частью контроллера массива. Теперь мне нужно выяснить, как это сделать.
5. … Я говорил вам дважды. 🙂 Один раз в последнем абзаце моего ответа и еще раз в моем первом комментарии выше. Используйте nsarraycontroller’s -AddObject: метод для добавления объектов «правильным способом».