绑定到Cocoa中的类方法?

时间:2011-04-19 20:18:36

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

如果我有类似的方法:

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

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

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

  

[   的addObserver:   forKeyPath:@ “CharacterSet.allCharacterSets”   选项:0x0上下文:0x200275b80]是   发送到不是的对象   符合KVC标准的“CharacterSet”   属性。

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

2 个答案:

答案 0 :(得分:5)

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

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

@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对象,即使在界面构建器中也是如此。

答案 1 :(得分:0)

@cocoafan ..我在热情的评论中意识到......我所说的例子可能不起作用,除非你按照我的选择实际实现你的GENIUS答案......为了使这个心灵变得笨拙(以及简单地说,魔术更加通用和有用......我刚刚创建了一个基本的类,但是我没有对它进行分类(是什么叫它?)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

bound by class

编辑...过了两天之后,我的简单思绪折叠起来试图记住这是谁的作用,以及为什么它如此精彩。我会继续在这里发帖,因为我必须做些事情来提醒自己这是什么,为什么我应该关心......所以一个基本的例子......

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

LOG NSCalibratedRGBColorSpace 1 0 0 1