自定义Xcode IDE插件错误:“找不到名为…的类”

我已经开发了自己的Xcode .ideplugin自定义对象添加到Xcode的对象库窗格。 我有我的自定义对象模板基于我称为IBMyCustomObject的类,它依次具有我称为MyCustomObject的类的runtimeClassName(运行时类名称是在加载Xib文件时将在运行时实例化的类的名称) 。

经过大量的研究,我已经能够成功地得到这个工作。 我现在可以将我的自定义对象从Objects Library窗格拖放到Xib文件中,在inspector窗格中设置对象属性,其他所有工作都很好。 唯一的问题出现在编译时,Xcode的ibtool在编译ibtool文件时给了我下面的错误:

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

这里是完整的exception回溯日志:

 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类的想法,以便它能够在编译时find它? 我已经尝试了很多东西,包括将MyCustomObject放置在框架中,并在运行时加载包,但没有任何工作。 如果我将IBMyCustomObject的runtimeClassNamereplace为NSMutableDictionary(或任何其他Foundation或UIKit类)而不是MyCustomObject,则一切正常,但我真的需要使用自己的MyCustomObject类。

PS:对于所有对开发类似插件感兴趣的人,一旦我有了一切,我会在sensiblecocoa.com (使用插件的框架)的详细博客文章中提出我的所有发现。

好吧,事实certificate,Xcode(更具体地说,ibtool)在编译期间产生了一个名为“Interface Builder Cocoa Touch Tool”的全新过程,这就解释了为什么加载MyCustomClass包没有任何作用。 我考虑的一个可能的解决scheme是使用dylib注入将MyCustomClass库注入到新产生的进程中,但是我发现没有任何一种技术足够可靠,以获得稳健和稳定的生产代码。

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