BWSplitView 和 PyObjc

3 投票
3 回答
751 浏览
提问于 2025-04-15 11:37

我正在尝试在一个Cocoa PyObjc项目中使用Brandon Walkin的BWSplitView,这是BWToolkit中的一个组件。当我运行这个项目时,出现了以下错误信息:

NSInvalidUnarchiveOperationException - *** -[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class (BWSplitView)

这是不是意味着他的工具包和PyObjc项目不兼容,所以我应该只使用默认的界面构建器视图?BWToolkit看起来非常适合我的程序,我打算在我的界面中其他地方也使用它。

3 个回答

0

我们遇到了类似的提示:

*** Terminating app due to uncaught exception ‘NSInvalidUnarchiveOperationException’, reason: ‘*** -[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class (MKMapView)’

在我们的情况下,这个问题是因为在目标的构建设置中,“框架搜索路径”里有一个多余的条目。当我们把这个条目删除后,问题就解决了。

0

我通过以下步骤解决了这个问题:
1. 下载并安装 http://github.com/jrydberg/pyobjc-bwtoolkitframework/tree/master
2. 确保你在 /System/Library/Frameworks 目录下安装了 BWToolkit.framework(你可以重新下载 BWToolkit,然后把文件夹复制过去)
3. 在 main.py 文件中使用 import BWToolkitFramework

5

我猜你遇到那个错误是因为你在一个nib/xib文件中使用了BWSplitView,而你试图加载这个文件。要从nib文件中解压出对象,运行时需要能够创建这些被存档的类的实例(比如BWSplitView)。抛出的异常是因为运行时找不到BWSplitView。在一个Objective-C应用中,你需要链接到BWToolkit框架,这样动态链接器就能把BWSplitView提供给运行时。而在PyObjC应用中,你必须明确导入你想让运行时使用的类(这些类不会像Cocoa类那样自动链接)。幸运的是,BWToolkit有一个桥接支持文件,所以你可以直接导入它(前提是它在一个标准的框架位置,比如/Library/Frameworks)。如果你需要加载一个没有桥接支持文件的框架,你可以使用objc.loadBundle,然后用NSClassFromString来获取类对象。

顺便提一下,/System/Library/Frameworks是苹果提供的系统框架的专用目录。你不应该把第三方框架放在这个文件夹里,因为苹果在系统更新时可能会清空这个文件夹(虽然不太可能,但有这种可能性)。所有用户都能使用的第三方框架应该放在/Library/Frameworks,用户特定的框架放在~/Library/Frameworks,而应用特定的框架则放在应用的Contents/Frameworks目录下,也就是在应用的包内。

撰写回答