如果我有类似的方法:
@interface CharacterSet
+ (NSArray *)allCharacterSets;
@end
我可以使用Cocoa绑定绑定它吗?
我正在尝试将NSComboBox的内容值连接到它。当我在IB中的“模型密钥路径”字段中输入CharacterSet.allCharacterSets
时,它不起作用,说:
[ 的addObserver: forKeyPath:@ “CharacterSet.allCharacterSets” 选项:0x0上下文:0x200275b80]是 发送到不是的对象 符合KVC标准的“CharacterSet” 属性。
我不确定还有什么可以尝试的。目前,我必须将allCharacterSets
的返回值存储到我的自定义窗口控制器(或自定义窗口)中的ivar中,以使其正常工作,这似乎是我不应该采取的额外步骤。
答案 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
编辑...过了两天之后,我的简单思绪折叠起来试图记住这是谁的作用,以及为什么它如此精彩。我会继续在这里发帖,因为我必须做些事情来提醒自己这是什么,为什么我应该关心......所以一个基本的例子......
NSObject *WHATEVS = NSObject.new;
NSLog(@"%@", [[WHATEVS.classProxy valueForKey:@"NSColor"] redColor]);
LOG NSCalibratedRGBColorSpace 1 0 0 1