Chr*_*ris 5 iphone pyobjc accelerometer 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)
#...
Run Code Online (Sandbox Code Playgroud)
问题是str(accelleration.x)返回"<native-selector x of <UIAcceleration: 0x.....>>".我能做什么?
一UIAcceleration的x-值是在Objective-C定义为一个属性,并访问acceleration.x在Python给你的方法命名为'’命名,而不是属性(伊娃)'X’为你所期望的X.你需要说:
acceleration._.x
Run Code Online (Sandbox Code Playgroud)
它使用PyObjC的"神奇"访问器机制来获取你想要的属性.
原因如下:
Python的类命名空间的工作方式,您不能拥有具有相同名称的方法和属性.这与Objective-C形成对比,其中getter方法通常与其访问的属性具有相同的名称.
这种差异可能会导致与Objective-C 2.0的属性功能略有混淆,特别是因为两种语言之间的语法看起来相同.在Objective-C中,您写道:
NSLog(@"foo's bar: %f", foo.bar);
foo.bar = 10.0;
Run Code Online (Sandbox Code Playgroud)
它会自动使用正确的setter或getter方法(-bar和-setBar:).由于Python的类命名空间规则,PyObjC不能完全按照Objective-C代码执行操作,并且必须只选择一个由名称表示的东西(方法或属性)foo.bar; 它选择的是方法.
| 归档时间: |
|
| 查看次数: |
857 次 |
| 最近记录: |