2009-10-22 2 views
4

Я хотел бы отслеживать NSCountedSet, чтобы узнать, меняется ли его содержимое. Настройка KVO, похоже, компилируется, но она не запускается. Первый вопрос: можете ли вы наблюдать набор? Если да, то что-то не так с этим сообщением?KVO на NSCountedSet?

[subViewA addObserver:subViewB forKeyPath:@"countedSet" options:0 context:NULL]; 

Я на самом деле просто пытается контролировать количество из (количество объектов) множество, если это помогает.

Edit - вот наблюдатель (subViewB):

- (void)observeValueForKeyPath:(NSString *)keyPath 
         ofObject:(id)object 
         change:(NSDictionary *)change 
         context:(void *)context { 
    if ([keyPath isEqual:@"countedSet"]) { 
     NSLog(@"Set has changed"); 
    } 
} 

Edit2 - переместил сообщение addObserver от подвид к ViewController. Поэтому я пытаюсь заставить один subView наблюдать NSCountedSet в другом подвидном представлении viewController. ключевой путь «относительно приемника» - который я предполагаю быть subViewA.

+1

Как вы меняете комплект? Вы используете KVO-совместимые аксессоры? – Chuck

+0

countedSet, объявленный как свойство (неатомное, сохраняемое) и правильно синтезированное. Я использую [myCountedSet addObject: newObject] (и его обратный removeObject :) для изменения набора. Может быть, мне нужен метод countOfCountedSet? – Meltemi

ответ

7

Говорить непосредственно с заданным объектом не выдает уведомления об изменении KVO. Вам необходимо внести изменения в заданное значение свойства с помощью KVC-совместимого способа. Существует два способа:

  1. Отправить сообщение владельцу mutableSetValueForKey: сообщение. Это даст вам поддельный заданный объект, который обертывает свойство и публикует уведомления KVO вокруг каждого изменения, которое вы ему делаете.
  2. Внедрите методы доступа к объекту для установки и используйте их везде. Реализация каждого метода напрямую связана с базовым заданным объектом; весь код, который не находится в одном из этих методов, должен пройти через них. Например, чтобы добавить объект, вы не должны использовать [myCountedSet addObject:foo] (кроме addCountedSetObject:); вместо этого вы должны использовать [self addCountedSetObject:foo].

Рекомендую # 2.Это может звучать как больше работы, но это немного, и это делает действительно хороший код.

Подробнее in the Model Object Implementation Guide и in the Core Data Programming Guide (даже если это не относится к основным данным).

+2

Обратите внимание, что это также верно для массивов. Если вы мутируете измененный массив из-под KVO, он не будет отправлять уведомления. – Chuck

3

Есть определенные методы ручной настройки KVO для неупорядоченных отношений между многими.

Не хотите ли устанавливать options на ненулевое значение? Например, NSKeyValueObservingOptionNew

Также Mike Ash's KVO Helper довольно неплохо.

Из документов NSSet на addObserver:

объекты NSSet не наблюдаем, поэтому этот метод вызывает исключение при вызове на объекте NSSet. Вместо , наблюдая за множеством, наблюдайте неупорядоченное отношение to-many, для которого набор представляет собой совокупность связанных объектов.

+0

Я полагаю, но я до сих пор не получаю, чтобы мой наблюдатель стрелял ... – Meltemi

+0

Я даже не знаю, что добавил этот последний бит »... Вместо того, чтобы наблюдать набор, наблюдайте за отношением неупорядоченных ко многим, для которых set - коллекция связанных объектов "означает?!? Таким образом, наборы не могут быть соблюдены? – Meltemi

+0

Но я не пытаюсь наблюдать «Объекты NSSet». Я просто хочу наблюдать сам набор ... или, более конкретно, «счет» набора. Если количество объектов, которые оно содержит, растет или сжимается. Я хочу, чтобы мой наблюдатель был уведомлен ... если это возможно. – Meltemi

0

Некоторые вещи, чтобы проверить:

  1. ли myController не- nil? Если это nil, сообщение addObserver:::: просто падает на пол тихо.
  2. Ваш метод вообще называется? Возможно, это называется, но не с ключевым путем, который вы ожидаете. (Я бы тоже этого не ожидал, но это стоит проверить.)
+0

Я проверил, что myController не равен нулю. Даже перемещали некоторые вещи, но безрезультатно ... и НЕТ, метод observValueForKeyPath НЕ получает вызов вообще. поэтому проводка должна быть винтовой. – Meltemi

 Смежные вопросы

  • Нет связанных вопросов^_^