Как обновление NSTableView из этого изменяемого массива работает в Какао?

В моем приложении у меня есть NSTableView, который должен содержать список файлов. У меня есть кнопка, которая используется для открытия диалогового окна и программного добавления файлов в этот список. Некоторое время мне не удавалось обновить представление таблицы при добавлении файлов, поскольку я использовал следующий код:

[self.newPackage.files addObject:fileURL];

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

Мне удалось собрать рабочее решение, в основном из этот вопрос со следующим кодом:

NSMutableArray *bindingsCompliantArray = [[self valueForKey:@"newPackage"] mutableArrayValueForKey:@"files"];
[bindingsCompliantArray addObject:fileURL];

Однако я не понимаю, как это работает. bindingsCompliantArray также больше нигде не используется. Я просмотрел документация для mutableArrayValueForKey, но это не делает ее более понятной. Есть ли кто-нибудь, кто мог бы помочь объяснить, как это работает?


person Stephen Booher    schedule 08.03.2011    source источник


Ответы (2)


Метод ‑mutableArrayValueForKey: возвращает прокси-массив, который можно рассматривать как исходный массив, с дополнительным бонусом, заключающимся в том, что изменения в массиве наблюдаются любыми наблюдателями KVO, наблюдающими за массивом.

NSController подклассы, такие как NSArrayController, используют наблюдение ключевого значения для отслеживания изменений в объектах, которые они наблюдают.

Когда вы получаете прокси-массив с помощью этого метода, наблюдатели заметят NSMutableArray методы, такие как ‑addObject:, тогда как со стандартным массивом это не так.

person Rob Keniger    schedule 09.03.2011
comment
Мне потребовалось больше месяца, прежде чем я наконец почувствовал, что понял, что на самом деле здесь происходит, но, похоже, ваш ответ точный, хотя и немного расплывчатый для новичка в Cocoa (меня). stackoverflow.com/questions/2293448/ и stackoverflow.com/questions/302365/ также помогли мне понять, как это работает. - person Stephen Booher; 22.04.2011

Вы используете метод addObject для обновления массива, и я думаю, что проблема остается. Попробуйте обновить его, установив НОВЫЙ массив с новым значением. Он должен работать! = D

Удачи!

person Leandro    schedule 09.03.2011
comment
Второй фрагмент кода в моем вопросе действительно работает. Мне было более любопытно узнать, почему и как это работает. - person Stephen Booher; 10.03.2011