использование KVO для обновления NSTableView, отфильтрованного NSPredicate

int size = (&arr)[1] - arr;

Проверьте эту ссылку для объяснения

1
задан KingRufus 20 May 2010 в 10:15
поделиться

2 ответа

Я нашел это в документации ( Соответствие KVC - Зависимые значения ):

Важно: обратите внимание, что вы не можете настроить зависимости от отношений ко многим. Например, предположим, что у вас есть Заказ объект с отношением ко многим (orderItems) в коллекцию Объекты OrderItem и OrderItem объекты имеют атрибут цены. Ты может потребоваться, чтобы объект Order имел totalPrice, то есть зависит от цен на все Объекты OrderItem в отношении. Вы не можете этого сделать, реализовав keyPathsForValuesAffectingValueForKey: и возврат orderItems.price в качестве keypath для totalPrice.Вы должны соблюдать ценовой атрибут каждого из объекты OrderItem в orderItems и ответить на изменения их значений путем обновления Итого Цените себя.

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

Когда я добавляю проект в массив "projects":

[newProject addObserver:self forKeyPath:@"tags" options:NSKeyValueObservingOptionNew context:nil];  

И важная часть:

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if ([object isKindOfClass:[CProject class]] && [keyPath isEqualToString:@"tags"])
    {
        [self willChangeValueForKey:@"projects"];
        [self didChangeValueForKey:@"projects"];
    }
}

И для очистки, когда я удаляю проект:

[project removeObserver:self forKeyPath:@"tags"];

Не уверен, что это лучшее решение, но оно постоянно обновляю мой список.

2
ответ дан 3 September 2019 в 00:26
поделиться

Я весьма удивлен, что ваш первый фрагмент кода вообще компилируется. Он также может работать не совсем так, как вы ожидаете, потому что

self.property = foo;

- это синтаксический сахар для

[self setProperty: foo];

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

0
ответ дан 3 September 2019 в 00:26
поделиться