使用PyObjC访问iPhone加速度计

时间:2011-03-10 21:52:26

标签: iphone accelerometer pyobjc uiaccelerometer

我想通过PyObjC访问我的iPhone的Accelerometer。 这是我的代码:

@objc.signature("v@:@@")
def accelerometer_didAccelerate_(self, accelerometer, acceleration):
    msgBox = UIAlertView.alloc().initWithTitle_message_delegate_cancelButtonTitle_otherButtonTitles_("Acceleration", str(acceleration.x), self, "OK", None)
    msgBox.show()
    msgBox.release()

@objc.signature("v@:@")
def applicationDidFinishLaunching_(self, unused):
    self.accelerometer = UIAccelerometer.sharedAccelerometer()
    self.accelerometer.setUpdateInterval_(1)
    self.accelerometer.setDelegate_(self)
    #...

问题是str(accelleration.x)返回"<native-selector x of <UIAcceleration: 0x.....>>"。我该怎么办?

1 个答案:

答案 0 :(得分:8)

UIAcceleration的{​​{1}} - 值在Objective-C中定义为property,在Python中访问x会为您提供方法命名为'x',而不是您所期望的名为'x'的属性(ivar)。你需要说:

acceleration.x

使用PyObjC的“魔术”访问器机制来获取你想要的属性。

原因:

Python的类命名空间的工作方式,你不能拥有一个具有相同名称的方法和属性。这与Objective-C形成对比,其中getter方法通常与其访问的属性具有相同的名称。

这种差异可能会导致与Objective-C 2.0的属性功能混淆,特别是因为两种语言之间的语法看起来相同。在Objective-C中,您写道:

acceleration._.x

自动使用正确的setter或getter方法(NSLog(@"foo's bar: %f", foo.bar); foo.bar = 10.0; -bar)。由于Python的类命名空间规则,PyObjC无法完全实现Objective-C代码的功能,并且必须只选择一个由名称-setBar:表示的事物(方法或属性);它选择的是方法。