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
}