NSArrayController и KVO

Что я должен сделать для обновления tableView, связанного с NSArrayController, когда метод называют, который обновляет основной массив? Пример мог бы разъяснить это.

Когда мое приложение запускается, оно создает SubwayTrain. Когда SubwayTrain инициализируется, он создает единственный SubwayCar. SubwayCar имеет изменяемый массив 'пассажиры'. То, когда Вагон метро инициализируется, пассажиры выстраивают, создается, и несколько Человек, в которых объекты вставляют (скажем, человек с именем "контролер" и другой, называют "бездомным парнем"). Эти парни всегда находятся на SubwayCar, таким образом, я создаю их при инициализации и добавляю их к массиву пассажиров.

Во время жизни приложения люди обшивают автомобиля. 'addPassenger' называют на SubwayCar с человеком, переданным в как аргумент.

Мне связали NSArrayController с subwayTrain.subwayCar.passengers, и в запуске мой контролер и бездомный парень обнаруживаются прекрасный. Но когда я использую [subwayCar addPassenger:], tableView не обновляет. Я подтвердил, что пассажир определенно добавляется к массиву, но ничто не обновляется в gui.

Что я, вероятно, буду делать неправильно? Мой инстинкт - то, что это - связанный KVO - контроллер массива не знает для обновления, когда addPassenger называют (даже при том, что addPassenger звонит [пассажирам addObject:]. Что могло я понять превратно здесь - я могу отправить код, если он помогает.

Благодаря любому готовому выручить.

ОБНОВЛЕНИЕ

Так, оказывается, что я могу заставить это работать путем изменения addPassenger методом от

[seatedPlayers addObject:person];

кому:

NSMutableSet *newSeatedPlayers = [NSMutableSet setWithSet:seatedPlayers];

[newSeatedPlayers addObject:sp];

[seatedPlayers release];

[self setSeatedPlayers:newSeatedPlayers];

Я предполагаю, что это вызвано тем, что я использую [сам setSeatedPlayers]. Действительно ли это - правильный способ сделать это? Это кажется ужасно громоздким, чтобы скопировать массив, выпустить старый и обновить копию (в противоположность просто добавлению к существующему массиву).

5
задан Chris Hanson 19 July 2010 в 06:10
поделиться

3 ответа

Итак, оказывается, я могу заставить это работать, изменяя методом AddPasnenger из

  [SeatedPlayers Addobject: Person];
 

к

 Nsmutableset * NewseatedPlayers = [SETWITHELSET NSMutablayset: SeatedPlayers];
 [newseatedPlayers addobject: sp];
 [SiteedPlayers выпуск];
 [Самотеатралистые пользователи: NewseatedPlayers];
 

Я думаю, это потому, что я использую [SelfeatedPlayers] . Это правильный способ сделать это?

Во-первых, это StrateEtplayers: , с толстой кишкой. Это жизненно важно в объекте-с.

Использование ваших собственных посетителей - это правильный способ сделать это, но вы используете неправильный правильный путь. Это работает, но вы все еще пишете больше кода, чем вам нужно.

Что вы должны сделать, это реализовать набор доступных доступных, таких как AddSeatedPlayersObject: . Затем отправьте себе это сообщение. Это делает добавление людей короткими одноклассниками:

[self addSeatedPlayersObject:person];

и до тех пор, пока вы следуете CVC-совместимые форматы доступа , вы получите уведомления KVO бесплатно, так же, как вы делаете со StrateEtPlayers: .

Преимущества этого над ststeatedPlayers: : :

  • Ваш код для мутата набора будет короче.
  • Потому что он короче, это будет чище.
  • Использование конкретных устройств набора-мутации предусматривает возможность определенного набора-мутации Уведомления КВО, а не общие уведомления об изменении общего чека.

Я также предпочитаю этот раствор в течение MutableSetValueForkey: , как для краткости, так и потому, что он так легко пропустить ключ в этой строке буквальный. ( Ули Kusterer имеет макрос, чтобы вызвать предупреждение, когда это происходит , что полезно, когда вам действительно нужно поговорить с самим kvc или KVO.)

1
ответ дан 13 December 2019 в 19:27
поделиться

Нельзя использовать localhost из VmWare (если приложение rails не работает в образе VmWare). Вам нужен IP-адрес или имя хоста хост-машины, mac в данном случае!

-121--2610596-

Я использовал gedit с выделением синтаксиса C и bash shell для компиляции и тестирования. Я храню Linux версию браузера Google Chrome под управлением локальной копии документации Go. В диспетчере окон Xubuntu я могу перевернуть окно браузера вверх и вниз из строки заголовка для тех случаев, когда мне нужно посмотреть на API пакета.

Переходите к компиляции и ссылкам очень быстро - я так же продуктивен с помощью этого набора инструментов, как когда-либо использовал Java и C # IDE. Как бы освежает писать программное обеспечение с просто «каменные ножи и медвежьи шкуры».

-121--1382791-

Я не знаю, считается ли его ошибка, но addObject: (and remeyObject: atIndex:) не генерирует уведомления KVO, поэтому контроллер массива/табличное представление не обновляется. Чтобы быть KVO-совместимым, используйте mutureArrayStartForKey:

Пример:

[[self mutableArrayValueForKey:@"seatedPlayers"] addObject:person];

Вы также хотите реализовать insertObject:inSeateTatAtIndex: так как методы KVO по умолчанию действительно медленные (они создают целый новый массив, добавляют объект к этому массиву и устанавливают исходный массив в новый массив - очень неэффективно)

- (void)insertObject:(id)object inSeatedPlayerAtIndex:(int)index
{
   [seatedPlayers insertObject:object atIndex:index];
}

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

7
ответ дан 13 December 2019 в 19:27
поделиться

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

insertObject:atArrangedObjectIndex:

на ArrayController?

.
2
ответ дан 13 December 2019 в 19:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: