Cocoa 如何为NSApp.dockTile';s

Cocoa 如何为NSApp.dockTile';s,cocoa,key-bindings,key-value-observing,cocoa-bindings,nsdocktile,Cocoa,Key Bindings,Key Value Observing,Cocoa Bindings,Nsdocktile,在IB中,很容易将标签或文本字段绑定到某个控制器的键路径 NSDockTile(可通过[[NSApp dockTile]setBadgeLabel:@“123”]获得)没有出现在IB中,我无法理解如何以编程方式绑定其“badgeLabel”属性,就像绑定label/textfield/table列一样 有什么想法吗?如果NSDockTile确实支持绑定,您可以使用方法bind:toObject:withKeyPath:options:在badgeLabel属性上设置绑定。有关要使用哪些参数的详细

在IB中,很容易将标签或文本字段绑定到某个控制器的键路径

NSDockTile(可通过[[NSApp dockTile]setBadgeLabel:@“123”]获得)没有出现在IB中,我无法理解如何以编程方式绑定其“badgeLabel”属性,就像绑定label/textfield/table列一样


有什么想法吗?

如果NSDockTile确实支持绑定,您可以使用方法
bind:toObject:withKeyPath:options:
在badgeLabel属性上设置绑定。有关要使用哪些参数的详细信息,请查看文档。如果不起作用,您可以在控制器类中实现键值观察,并在每次值更改时更新标签,甚至覆盖NSDockTile以创建与绑定兼容的子类。

我在控制器上的NSDockTile上尝试了大量的
bind:toObject:withKeyPath:options:
,在数据源上。我想不出一个有效的组合。或者,是否有一种方法可以将BatchController对象绑定到数据源,然后更新徽章?如何获取NSObject并使其可绑定?

NSDockTile没有任何绑定,因此您的控制器必须手动更新dock磁贴。您可以使用KVO来实现这一点,KVO与绑定KVO具有相同的效果

将上下文创建为全局上下文:


static void* MyContext=(void*)@"MyContext";
然后,在init方法中:


[objectYouWantToWatch addObserver:self forKeyPath:@"dockTileNumber" options:0 context:MyContext];
然后,您必须实现此方法才能收到密钥路径更改的通知:

- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if (context == MyContext) {
        [[NSApp dockTile] setBadgeLabel:[object valueForKeyPath:keyPath]];
    }
    else {
        [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
    }
}

确保在控制器对象消失时删除观察者。

不删除。如果一个对象不显式支持绑定到属性,那么它可能会做一些使绑定行为不稳定的事情(例如,直接分配给它的ivar)。无论如何绑定到它都会在应用程序中显示该行为。