我已经开发了自己的自定义Xcode .ideplugin,可以将自定义对象添加到Xcode的对象库窗格中。我有一个基于我称为IBMyCustomObject的类的自定义对象模板,后者又有一个名为MyCustomObject的类的runtimeClassName(运行时类名是在加载Xib文件时将在运行时实例化的类的名称)
经过大量的研究,我已经成功地完成了这项工作。我现在可以将我的自定义对象从“对象库”窗格拖放到Xib文件中,在“检查器”窗格中设置对象属性,其他一切都很好用。唯一的问题出现在编译时,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放在一个框架中并在运行时加载bundle,但根本没有任何工作。如果我用NSMutableDictionary(或任何其他的Foundation或UIKit类)而不是MyCustomObject替换IBMyCustomObject的runtimeClassName,一切都很完美,但我真的需要使用我自己的MyCustomObject类。
P.S。:对于每个有兴趣开发类似插件的人,我会在sensiblecocoa.com(使用插件的框架)的详细博客文章中提出我的所有发现。一旦我知道了一切。
答案 0 :(得分:6)
好的,事实证明Xcode(更具体地说是ibtool)在编译期间产生了一个名为“Interface Builder Cocoa Touch Tool”的全新过程,这解释了为什么加载MyCustomClass
包没有效果。我考虑的一个可能的解决方案是使用dylib注入将MyCustomClass
库注入到新生成的进程中,但是我发现的所有技术都不够可靠,无法提供稳健的生产代码。
我最终使用NSMutableDictionary
而不是MyCustomClass
,这完全编译。然后我在对象所有者类中使用setter属性方法将加载的NSMutableDictionary
转换为MyCustomClass
,然后手动将所有字典键分配给它们各自的属性。正如我之前所说,我将在sensiblecocoa.com博客页面上发布所有插件开发详细信息。