NSPredicateEditor callBack, когда NSPredicate добавлен или изменен

Я на XCode 9.3, Objective-C, OSX не iOS.

Я использую NSPredicateEditor в моем приложении, которое до сих пор работает нормально. Однако у меня есть представление, которое должно обновлять его содержимое с помощью предикатов, установленных в редакторе (в основном представление показывает отфильтрованные массивы).

В настоящее время у меня есть кнопка "Обновить", которую пользователь должен нажать, чтобы обновить представление, как только он что-то изменит в редакторе.

Мне было интересно, есть ли способ вызвать мой метод для автоматического обновления представления при добавлении предиката Row ИЛИ изменить?

Я пытался добавить наблюдателя в NSPredicateEditor.objectValue - но я не получаю уведомления.

- (void)viewWillAppear {
    [self.predicateEditor.objectValue addObserver:self selector:@selector(predicateChangedByUser:) name:@"Test" object:nil];
}

- (void)predicateChangedByUser:(NSNotification*)aNotification {
    NSLog(@"Changed: %@",aNotification);
}

Любая помощь приветствуется

1 ответ

Решение

Вы не получаете уведомление, потому что вы пытаетесь объединить уведомление и KVO. Некоторые решения:

Решение A: соедините действие редактора предикатов с методом действия.

Решение Б: соблюдайте уведомление NSRuleEditorRowsDidChangeNotification,

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(predicateChangedByUser:) name:NSRuleEditorRowsDidChangeNotification object:self.predicateEditor];

- (void)predicateChangedByUser:(NSNotification *)notification {
    NSLog(@"predicateChangedByUser");
}

Решение C: соблюдать ключевой путь predicate редактора предикатов. predicate является собственностью NSRuleEditor,

static void *observingContext = &observingContext;

[self.predicateEditor addObserver:self forKeyPath:@"predicate" options:0 context:&observingContext];

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if (context == &observingContext)
        NSLog(@"observeValueForKeyPath %@", keyPath);
    else
        [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}

Решение D: связать значение редактора со свойством предиката.

NSPredicateEditor имеет селектор действий, который можно подключить в коде или с помощью выхода в дизайнере интерфейса к функции, например:

- (IBAction)predicateChanged:(id)sender {
    // Update your view
}
Другие вопросы по тегам