gpt4 book ai didi

iphone - 使用 PyObjC 访问 iPhone 加速计

转载 作者:行者123 更新时间:2023-12-03 18:54:40 25 4
gpt4 key购买 nike

我想通过 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) 返回 "<native-selector x of <UIAcceleration: 0x.....>>" 。我能做什么?

最佳答案

UIAccelerationx 值在 Objective-C 中定义为 property ,并且在 Python 中访问 acceleration.x 会为您提供名为“x”的方法,而不是您所期望的名为“x”的属性 (ivar)。你需要说:

acceleration._.x

它使用 PyObjC 的“神奇”访问器机制来获取您想要的属性。

原因:

Python 类命名空间的工作方式是,不能有同名的方法和属性。这与 Objective-C 形成鲜明对比,在 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 表示。 >;它选择的是方法。

关于iphone - 使用 PyObjC 访问 iPhone 加速计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5266364/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com