【发布时间】:2011-12-09 07:05:05
【问题描述】:
我正在 Lion 上的 PyObjC 中编写一些 AppKit 代码,并且我想使用特殊的 KVC 访问器样式,例如obj._.field = value 而不是 obj.setField_(value)。
我已经成功地使用 KVC 设置了 NSString 和 NSDictionary 值的属性,但是我在包装 Objective-C 结构时遇到了问题,特别是 NSSize 和 NSRect。
当我尝试设置 NSSize 或 NSRect 类型的 KVC 属性时,Objective-C 层会抛出 NSInvalidArgumentException。 Cocoa 正在尝试在 Python 对象上调用 sizeValue 或 rectValue。
这是显示问题的交互式提示处的日志:
% python
Python 2.7.1 (r271:86832, Jul 31 2011, 19:30:53)
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from AppKit import *
>>> NSApplication.sharedApplication()
<NSApplication: 0x7fcf6ae071f0>
>>> w = NSWindow.alloc().init()
>>> w._.minSize = NSSize(100, 200)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC/objc/_convenience.py", line 141, in __setattr__
return self.__object.setValue_forKey_(value, key)
ValueError: NSInvalidArgumentException - Class OC_PythonObject: no such selector: sizeValue
>>> r = NSMakeRect(100, 200, 300, 400)
>>> w._.frame=r
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC/objc/_convenience.py", line 141, in __setattr__
return self.__object.setValue_forKey_(value, key)
ValueError: NSInvalidArgumentException - Class OC_PythonObject: no such selector: rectValue
PyObjC 似乎将结构包装在 OC_PythonObject 代理中,它没有实现预期的 KVC 转换器。 KVC 代码假定该值类似于 NSValue 并实现结构访问器方法。
有没有办法在 PyObjC 中设置结构值 KVC 属性?
【问题讨论】:
标签: cocoa pyobjc key-value-coding