【问题标题】:How to create a binding for NSApp.dockTile's如何为 NSApp.dockTile 的创建绑定
【发布时间】:2009-01-06 13:58:33
【问题描述】:

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

NSDockTile(可通过 [[NSApp dockTile] setBadgeLabel:@"123"] 获得)没有出现在 IB 中,我无法弄清楚如何以编程方式绑定其“badgeLabel”属性,就像您可能绑定标签/文本字段一样/table 列。

有什么想法吗?

【问题讨论】:

    标签: cocoa key-bindings key-value-observing cocoa-bindings nsdocktile


    【解决方案1】:

    NSDockTile 没有任何绑定,因此您的控制器必须手动更新停靠图块。您可以使用 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];
        }
    }
    

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        我在 NSDockTile、控制器和数据源上尝试了很多 bind:toObject:withKeyPath:options: 的变体。我想不出一个有效的组合。或者,有没有办法让 BatchController 对象绑定到数据源,然后更新徽章?如何获取 NSObject 并使其可绑定?

        【讨论】:

        • 你没有。如果一个对象不明确支持绑定到一个属性,那么它可能正在做一些使绑定行为不正常的事情(例如,直接分配给它的 ivar)。无论如何绑定到它都会在您的应用中体现这种行为。
        猜你喜欢
        • 2016-07-31
        • 2011-08-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-26
        • 2017-06-28
        • 2019-11-06
        相关资源
        最近更新 更多