gpt4 book ai didi

ios - 自定义 Xcode IDE 插件错误 : "Could not find class named..."

转载 作者:可可西里 更新时间:2023-11-01 03:31:17 25 4
gpt4 key购买 nike

我开发了自己的自定义 Xcode .ideplugin 以将自定义对象添加到 Xcode 的 Object Library Pane 。我有基于我称为 IBMyCustomObject 的类的自定义对象模板,该模板又具有我称为 MyCustomObject 的类的运行时类名(运行时类名是加载 Xib 文件时将在运行时实例化的类的名称) .

经过大量研究,我已经能够成功地实现这一目标。我现在可以正常地将我的自定义对象从对象库 Pane 拖放到 Xib 文件,在检查器 Pane 中设置对象属性,其他一切都很好。唯一的问题出现在编译时,Xcode 的 ibtool 在编译 Xib 文件时给我以下错误:

Exception name: NSInvalidArgumentException
Exception reason: Could not find class named MyCustomObject

这是完整的异常回溯日志:

Exception backtrace: 
0. CoreFoundation 0x0226d6d8 __exceptionPreprocess
1. libobjc.A.dylib 0x01fe98b6 objc_exception_throw
2. CoreFoundation 0x022fd721 -[NSException raise]
3. ??? 0x000116b8 [IBCocoaTouchToolObjectPackage initWithRequest:]
4. ??? 0x00010597 [IBCocoaTouchTool .cxx_destruct]
5. ??? 0x0000b63d [IBCocoaTouchTool compileNibForRequest:minimumCompatibility:layoutInfo:]
6. IBFoundation 0x00362c51 __72-[IBMessageReceiveChannel deliverMessage:toTarget:withArguments:result:]_block_invoke
7. IBFoundation 0x00362996 -[IBMessageReceiveChannel deliverMessage:toTarget:withArguments:result:]
8. IBFoundation 0x00362673 __80-[IBMessageReceiveChannel runBlockingReceiveLoopNotifyingQueue:notifyingTarget:]_block_invoke
9. libdispatch.dylib 0x029c2444 _dispatch_barrier_sync_f_slow_invoke
10. libdispatch.dylib 0x029d34b0 _dispatch_client_callout
11. libdispatch.dylib 0x029c1766 _dispatch_main_queue_callback_4CF
12. CoreFoundation 0x022d2b6e __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__
13. CoreFoundation 0x022137eb __CFRunLoopRun
14. CoreFoundation 0x02212bf3 CFRunLoopRunSpecific
15. CoreFoundation 0x02212a0b CFRunLoopRunInMode
16. Foundation 0x01c1fe55 -[NSRunLoop(NSRunLoop) runMode:beforeDate:]
17. ??? 0x0003ac67 [IBAbstractCocoaTouchTool startServingReceiveChannel:]
18. ??? 0x0003ad62 [IBAbstractCocoaTouchTool startServingSocket:]
19. ??? 0x0003aec7 [IBAbstractCocoaTouchTool protocolCapabilities]
20. ??? 0x0001053e [IBCocoaTouchTool .cxx_destruct]
21. libdyld.dylib 0x9313d725 start
Exception info:{
}

关于如何让 Xcode(更具体地说是 ibtool)知道 MyCustomObject 类以便它可以在编译时找到它的任何想法?我已经尝试了很多事情,包括将 MyCustomObject 放在框架中并在运行时加载包,但根本没有任何效果。如果我将 IBMyCustomObject 的 runtimeClassName 替换为 NSMutableDictionary(或任何其他 Foundation 或 UIKit 类)而不是 MyCustomObject,则一切正常,但我确实需要改用我自己的 MyCustomObject 类。

P.S.:对于所有对开发类似插件感兴趣的人,我将在 sensiblecocoa.com 上的详细博客文章中展示我的所有发现。 (使用插件的框架)一旦我弄清楚了一切。

最佳答案

好吧,事实证明 Xcode(更具体地说是 ibtool)在编译期间生成了一个名为“Interface Builder Cocoa Touch Tool”的全新进程,这解释了为什么加载 MyCustomClass 包没有效果.我考虑过的一种可能的解决方案是使用 dylib 注入(inject)将 MyCustomClass 库注入(inject)到新生成的进程中,但我发现的技术都不够可靠,无法生成健壮和稳定的生产代码。

我最终使用 NSMutableDictionary 而不是 MyCustomClass,编译完美。然后我在对象所有者类中使用一个 setter 属性方法将加载的 NSMutableDictionary 转换为 MyCustomClass,然后手动将所有字典键分配给它们各自的属性。正如我之前所说,我将在 sensiblecocoa.com 上发布所有插件开发细节。博客页面。

关于ios - 自定义 Xcode IDE 插件错误 : "Could not find class named...",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18403328/

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