NSPredicate 添加或更改时的 NSPredicateEditor 回调
NSPredicateEditor callBack when NSPredicate added or changed
我在 XCode 9.3,objective-c,OSX 而不是 iOS。
我在我的应用程序中使用了 NSPredicateEditor,到目前为止它运行良好。但是我有一个视图应该使用编辑器中设置的谓词更新其内容(基本上视图显示过滤数组)。
目前我有一个 "Refresh" 按钮,用户在编辑器中更改内容后需要点击该按钮来更新视图。
我想知道是否有办法在 predicateRow added OR changed 时触发我的方法自动更新视图?
我试图将观察者添加到 NSPredicateEditor.objectValue - 但我没有收到通知。
- (void)viewWillAppear {
[self.predicateEditor.objectValue addObserver:self selector:@selector(predicateChangedByUser:) name:@"Test" object:nil];
}
- (void)predicateChangedByUser:(NSNotification*)aNotification {
NSLog(@"Changed: %@",aNotification);
}
感谢任何帮助
您没有收到通知,因为您正在尝试组合通知和 KVO。一些解决方案:
解决方案 A:将谓词编辑器的操作连接到操作方法。
解决方案 B:观察通知 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' 有一个 'action' 选择器,可以在代码中连接,也可以通过使用界面设计器中的插座连接到函数,如下所示:
- (IBAction)predicateChanged:(id)sender {
// Update your view
}
我在 XCode 9.3,objective-c,OSX 而不是 iOS。
我在我的应用程序中使用了 NSPredicateEditor,到目前为止它运行良好。但是我有一个视图应该使用编辑器中设置的谓词更新其内容(基本上视图显示过滤数组)。
目前我有一个 "Refresh" 按钮,用户在编辑器中更改内容后需要点击该按钮来更新视图。
我想知道是否有办法在 predicateRow added OR changed 时触发我的方法自动更新视图?
我试图将观察者添加到 NSPredicateEditor.objectValue - 但我没有收到通知。
- (void)viewWillAppear {
[self.predicateEditor.objectValue addObserver:self selector:@selector(predicateChangedByUser:) name:@"Test" object:nil];
}
- (void)predicateChangedByUser:(NSNotification*)aNotification {
NSLog(@"Changed: %@",aNotification);
}
感谢任何帮助
您没有收到通知,因为您正在尝试组合通知和 KVO。一些解决方案:
解决方案 A:将谓词编辑器的操作连接到操作方法。
解决方案 B:观察通知 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' 有一个 'action' 选择器,可以在代码中连接,也可以通过使用界面设计器中的插座连接到函数,如下所示:
- (IBAction)predicateChanged:(id)sender {
// Update your view
}