2011-03-10 218 views
5

我想通過PyObjC訪問我的iPhone的加速度計。 這裏是我的代碼:使用PyObjC訪問iPhone加速度計

@objc.signature("[email protected]:@@") 
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("[email protected]:@") 
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.....>>"。我能做什麼?

回答

8

UIAccelerationx - 值是在Objective-C定義爲property,和在Python訪問acceleration.x給你方法命名爲‘X’,而不是屬性(的ivar)命名爲‘X’,你可能會期望。你需要說:

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;它選擇的東西是方法。