- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
官方文档说可以在Python代码中使用自定义 block ,但需要创建元数据。我还没有找到这样的例子。
我的问题是如何创建、使用和分发自定义 block 的元数据。
示例
@interface SomeClass
- (void)doSomethingWithCompletion: (void (^)(SomeObject *obj, NSError *error))myBlock;
@end
def pythonMethod():
def completion(obj, error):
# staff
foo = SomeClass.new()
foo.doSomethingWithCompletion_(somehow_pass_completion)
问题是 somehow_pass_completion
应该是什么样子,以及如何为 myBlock
提供元数据。
最佳答案
所提到的元数据是以 XML 格式存储的有关 Objective-C 方法的返回类型和参数类型的信息。需要它,以便 PyObjC 桥知道将 Python 对象传递回 Objective-C 代码时将其转换为什么类型。如果您愿意,可以查看元数据;它位于 PyObjC 框架内的 .bridgesupport 文件中。例如,AppKit 元数据位于/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/PyObjC/AppKit/PyObjC.bridgesupport 它可以为您使用的任何 Objective-C 代码生成Apple 的 gen_bridge_metadata
命令行工具。有一个man page对于该实用程序,以及 man 5 BridgeSupport
也提供了丰富的信息。1
PyObjC 提供了函数 objc.registerMetaDataForSelector
和 objc.parseBridgeSupport
,这两个函数都允许您使用 Python 字典(前一个函数)为您的方法添加元数据或 BridgeSupport 手册页中描述的 XML 格式(后者)。使用 registerMetaData...
的示例可在 pyobjc 源代码中找到:pyobjc/pyobjc-core/PyObjCTest/test_metadata* (以及附近的 test_metadata*.py
文件)2。
举个例子,这是 -[NSSavePanel beginWithCompletionHandler:]
的元数据,它接受一个 block 作为参数:
<method selector='beginWithCompletionHandler:'>
<arg index='0' block='true' >
<retval type='v' />
<arg type='i' type64='q' />
</arg>
</method>
arg 类型说明符相同 Type Encodings在 Obj-C 中使用 @encode
得到的结果。您的方法的元数据应该非常相似。
因此,既然您的方法是在 Objective-C 中原型(prototype)化的,那么您应该能够通过 gen_bridge_metadata 运行它们来创建一个可以包含在项目中的 .bridgesupport 文件,然后使用 objc.parseBridgeSupport
读取该文件。过去使用 objc.registerMetaDataForSelector 也对我有用;查看上面链接的示例。
一旦您在 PyObjC“系统”中拥有元数据,您就可以使用任何旧的可调用对象作为采用 block 的方法的参数:
def pythonMethod():
def myCompletionHandler(obj, error):
pass
foo = SomeClass.new()
foo.doSomethingWithCompletion_(myCompletionHandler)
这是我在这里发表的有关 PyObjC 的其他几篇文章的综合体:PyObjC and Returning Out Parameters | Indexed Accessor Method | Problem with openPanelDidEnd 。您可能也想看看这些。
我已经有一段时间没有搞过这个了,所以我可能遗漏了一些东西。如果您仍然无法使其正常工作,请随时询问更多信息。不过,不要轻易放弃——这座桥是一头有趣的野兽,有时你只需要向它展示谁才是老大!
<小时/>1您应该阅读的另一个 Apple 文档是:Generating Framework Metadata .
2我通过 pyobjc-dev mailing list thread 发现了这些
关于cocoa - PyObjC 和自定义 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5888278/
我不小心安装了 pyobjc 2.2 和 easy-install pyobjc,这导致了问题:当我尝试导入它时出现错误 Incompatible library version: _objc.so
我构建了一个 pyobjc 应用程序,发现它似乎需要很长时间才能加载。 我添加了日志记录来测量加载每个步骤所需的时间。在进入 AppHelper.runEventLoop() 之前,应用程序需要花费
我正在尝试使用 PyObjC 制作一个应用程序,并且正在努力寻找如何记录箭头键(向左和向右)。我希望能够记录用户每次按下左右箭头键的时间。我正在使用网上找到的另一个例子。我想使用键盘上的箭头键,而不是
编辑:感谢您的建议。我仍然不清楚自动释放池的实际处理方式。 这是实际的代码: import platform, time if (platform.system().lower() == "darwi
我已经在 Mac 上安装了 PyObjC,但我根本无法让它工作。即使尝试导入 AddressBook 类也会立即失败。 Python 2.7.2 (v2.7.2:8527427914a2, Jun 1
我理解 PyObjC 的概念,但找不到任何关于它到底是什么或如何开始使用它的信息。 它是否像一个转换器,您可以在其中输入 python 文件并获得一个 objective c 文件?或者它是一个你可以
Xcode最强大的功能之一就是Intellisense completion,当您键入Foundation/Cocoa/UIKit API的名称时,它会弹出一个潜在候选列表。我对MacRuby,PyO
我正在使用此层次结构在 PyObjC 中以编程方式创建一个菜单。 NSMenu (setMainMenu on NSApplication) - NSMenuItem(1) - NSMenu: "
官方文档说可以在Python代码中使用自定义 block ,但需要创建元数据。我还没有找到这样的例子。 我的问题是如何创建、使用和分发自定义 block 的元数据。 示例 @interface Som
我正在尝试为 NSWebView 实现一个委托(delegate),但是当我运行它时,我得到了这个错误: TypeError: Error when calling the metaclass bas
当我在 pyObjC 代码中调用 setDelegate_ 时,我收到 AttributeError: 'tuple' object has no attribute 'setDelegate_'。
我正在尝试根据 the KVC guide 在 Python 中为我的模型类实现索引访问器方法。 .出于性能原因,我想使用可选的范围方法一次加载多个对象。该方法采用指向 C 数组缓冲区的指针,我的方法
在 OSX Maverick 上,我有这个基于 PyObjC(python3.3) 的简单 APP test.py class MyDelegate(NSObject): def applicatio
我正在学习如何使用 pyobjc 进行一些基本原型(prototype)制作。现在我有一个主 UI 设置和一个运行主应用程序的 python 脚本。唯一的问题是当脚本运行时,脚本在主线程上运行从而阻塞
如何使用 PyObjC 获取全局滚动事件?可以通过 NSEvent 调用来完成吗? 示例代码会很棒... 最佳答案 您的 NSEvent 走在正确的轨道上!只要您不想修改事件,而只是观察它,就像调用
我正在尝试在 Cocoa PyObjc 项目中使用来自 BWToolkit 的 Brandon Walkin 的 BWSplitView。当我运行该项目时,我收到以下错误消息: NSInvalidUn
我正处于开发跨平台(Mac 和 Windows)应用程序的规划阶段。性能不是问题,Python 非常适合问题领域。我是一名具有 pyojc 经验的 Cocoa 开发人员。 Cocotron 看起来很吸
我想为我正在设计的应用程序使用 NSOpenPanel。这是我到目前为止所拥有的: @objc.IBAction def ShowOpenPanel_(self, sender): self.
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题吗? 更新问题,以便 editing this post 提供事实和引用来回答它. 关闭 9 年前。 Improve
我将在 Mac App Store 中销售一个使用该框架的程序。我想确保它能得到 Apple 的批准。 最佳答案 是的。 $ /usr/bin/python2.6 Python 2.6.1 (r261
我是一名优秀的程序员,十分优秀!