【问题标题】:Binding to a class method in Cocoa?绑定到 Cocoa 中的类方法?
【发布时间】:2011-04-19 20:18:35
【问题描述】:

如果我有这样的方法:

@interface CharacterSet
    + (NSArray *)allCharacterSets;
@end

我可以使用 Cocoa 绑定来绑定它吗?

我正在尝试将 NSComboBox 的内容值连接到它。当我在 IB 的“模型密钥路径”字段中输入CharacterSet.allCharacterSets 时,它不起作用,说:

[ 添加观察者: forKeyPath:@"CharacterSet.allCharacterSets" 选项:0x0 上下文:0x200275b80] 是 发送到一个不是 “CharacterSet”的 KVC 兼容 属性。

我不确定还可以尝试什么。目前我必须将 allCharacterSets 的返回值存储到我的自定义窗口控制器(或自定义窗口)中的 ivar 中以使其工作,这似乎是我不应该采取的额外步骤。

【问题讨论】:

    标签: cocoa-bindings static-methods key-value-coding


    【解决方案1】:

    我正在开发一个巨大的应用程序,你提到的额外步骤对我来说真的很痛苦。所以我开发了一个处理类方法绑定的小型代理类。

    首先我添加了一个小型代理类

    @implementation INClassProxy
    
    - (id)valueForUndefinedKey:(NSString *)key {
        return NSClassFromString(key);
    }
    
    @end
    

    然后为 NSApplication 添加了一个类别访问器

    - (id)classProxy {
        static INClassProxy *proxy = nil;
        if (proxy == nil)
            proxy = [[INClassProxy alloc] init];
        return proxy;
    }
    

    (我实际上将它添加到我的应用程序委托并实现了application:delegateHandlesKey:

    现在您可以使用 keyPath @"classProxy.CharacterSet.allCharacterSets" 将类方法绑定到 Application 对象,即使在接口构建器中也是如此。

    【讨论】:

    • 非常聪明优雅的解决方案。
    • 这是迄今为止hocus-pocus 有史以来最好的绑定。详细阐述完美...继续在 IB 中创建一个“通用的蓝色立方体”NSObject 实例...然后将您的心内容绑定到该单个对象上,使用任意数量的“事物”...只需每次更改关键路径即可。 . 即.. 你想将NSPopupButton 绑定到NSArray,例如返回NSColor 上的类方法……将按钮绑定到classProxy.NSColor.colorLists。如此激烈的是,那个单一的出口是通往任何 NSObject 的门户!
    【解决方案2】:

    @cocoafan.. 我在热情洋溢的评论中意识到.. 我所说的示例可能行不通,除非您按照我的选择实际实施您的天才答案……为了使这个令人麻木的聪明(以及一样简单)魔法更加通用和有用......我刚刚创建了一个你所描述的基本类,但不是分类(这就是它的名字吗?)NSApplication,我在NSObject 上做了。下面的完整示例...

    @interface AZClassProxy : NSObject
    @end
    @interface NSObject (AZClassProxy)
    - (id)classProxy;
    @end
    

    @implementation AZClassProxy
    - (id) valueForUndefinedKey:(NSString*)k { return NSClassFromString(k); }
    @end
    @implementation NSObject (AZClassProxy)
    - (id) classProxy { static AZClassProxy *prx = nil; return prx = prx ?: AZClassProxy.new; }
    @end
    

    编辑…… 大约 2 天后,我简单的头脑折叠起来,试图记住这是谁的作品,以及为什么它如此美妙。我将继续在这里发帖,因为我必须做一些事情来提醒自己这是什么,以及为什么我应该关心......所以一个基本的例子......

    NSObject *WHATEVS = NSObject.new;
    NSLog(@"%@", [[WHATEVS.classProxy valueForKey:@"NSColor"] redColor]);
    

    日志NSCalibratedRGBColorSpace 1 0 0 1

    【讨论】:

    • 谢谢。老实说,我不记得为什么我选择了NSApplication
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-25
    • 2011-04-07
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多