使用PyObjC访问iPhone加速度计

5

我想通过 PyObjC 访问我的 iPhone 的加速度计。这是我的代码:

@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) 返回 "<UIAcceleration: 0x.....>>"。我该怎么办?
1个回答

8
一个 UIAccelerationx 值在 Objective-C 中被定义为一个 属性,在 Python 中访问 acceleration.x 会给你一个名为 'x' 的 方法,而不是你可能期望的名为 'x' 的属性 (ivar)。你需要这样说:
acceleration._.x

这里使用了PyObjC的“魔法”访问机制来获取你想要的属性。

原因如下:

Python类命名空间的工作方式是,你不能有一个同名的方法和属性。这与Objective-C不同,因为getter方法通常与它访问的属性同名。

这种差异可能会在Objective-C 2.0的属性特性中引起一些混淆,特别是因为两种语言的语法看起来相同。在Objective-C中,你可以这样写:

NSLog(@"foo's bar: %f", foo.bar);
foo.bar = 10.0;

该方法会自动使用适当的setter或getter方法(-bar-setBar:)。由于Python的类命名空间规则,PyObjC无法完全执行Objective-C代码所做的操作,只能选择一个属性或方法来代表名称foo.bar,而它所选择的是方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接