0

我使用的是 XCode 9.3、objective-c、OSX 而不是 iOS。

我在我的应用程序中使用了一个 NSPredicateEditor ,到目前为止效果很好。但是我有一个视图应该使用编辑器中设置的谓词更新其内容(基本上视图显示过滤数组)。

目前,我有一个“刷新”按钮,用户需要在编辑器中更改某些内容后点击更新视图。

我想知道是否有办法触发我的方法在添加更改predicateRow 时自动更新视图?

我试图将观察者添加到 NSPredicateEditor.objectValue - 但我没有收到通知。

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

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

任何帮助表示赞赏

4

2 回答 2

0

您没有收到通知,因为您正在尝试将通知和 KVO 结合起来。一些解决方案:

解决方案 A:将谓词编辑器的操作连接到操作方法。

解决方案 B:观察通知NSRuleEditorRowsDidChangeNotification

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

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

解决方案 C:观察谓词编辑器的 keypath predicatepredicate是 的一个属性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:将编辑器的值绑定到谓词属性。

于 2018-03-03T22:17:47.663 回答
0

'NSPredicateEditor' 有一个 'action' 选择器,可以在代码中或通过使用界面设计器中的插座连接到函数,如下所示:

- (IBAction)predicateChanged:(id)sender {
    // Update your view
}
于 2020-01-12T09:18:41.427 回答