2011-03-10 14 views
5

Quiero acceder al Acelerómetro de mi iPhone a través de PyObjC. Aquí está mi código:Acceso al acelerómetro iPhone usando PyObjC

@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) 
    #... 

El problema es str (accelleration.x) devuelve "<native-selector x of <UIAcceleration: 0x.....>>". ¿Que puedo hacer?

Respuesta

8

Un UIAcceleration 'x -valor s se define en Objective-C como property, y acceder a acceleration.x en Python le da la método llamado 'x', no el atributo (Ivar) llamado 'x' como puede ser que esperar. Es necesario decir:

acceleration._.x 

que utiliza el mecanismo de acceso "mágica" de PyObjC para obtener el atributo que desea.

Las razones para esto:

La forma en espacios de nombres de clase de Python funcionan, no se puede tener un método y un atributo con el mismo nombre. Esto está en contraste con Objective-C, donde un método getter a menudo tiene el mismo nombre que el atributo al que accede.

Esta diferencia puede causar un poco de confusión con la característica de propiedades de Objective-C 2.0, especialmente porque la sintaxis se ve idéntica entre los dos idiomas. En Objective-C, se escribe:

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

Qué utiliza automáticamente los setter o getter métodos adecuados (-bar y -setBar:). PyObjC, debido a la regla de espacio de nombres de clase de Python, no puede hacer exactamente lo que haría el código Objective-C, y tiene que elegir solo una cosa (método o atributo) para ser representada por el nombre foo.bar; lo que elige es el método.

Cuestiones relacionadas