我开发了自己定制的Xcode .ideplugin,以将自定义对象添加到Xcode的对象库面板中。我的自定义对象模板基于一个名为IBMyCustomObject的类,该类的运行时类名是一个名为MyCustomObject的类(运行时类名是在加载Xib文件时将实例化的类的名称)。
经过大量研究,我已成功地使其工作。现在,我可以从“对象库”面板正常地将自定义对象拖放到Xib文件中,在检查器面板中设置对象属性,一切都很好。唯一的问题出现在编译时,当Xib文件被编译时,Xcode的
有什么方法可以让Xcode(更具体地说是ibtool)知道MyCustomObject类,以便在编译时找到它?我尝试过很多方法,包括将MyCustomObject放入框架并在运行时加载bundle,但没有任何作用。如果我将IBMyCustomObject的runtimeClassName替换为NSMutableDictionary(或任何其他Foundation或UIKit类)而不是MyCustomObject,则一切都能完美地工作,但我确实需要使用自己的MyCustomObject类。
经过大量研究,我已成功地使其工作。现在,我可以从“对象库”面板正常地将自定义对象拖放到Xib文件中,在检查器面板中设置对象属性,一切都很好。唯一的问题出现在编译时,当Xib文件被编译时,Xcode的
ibtool
会给我以下错误: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,但没有任何作用。如果我将IBMyCustomObject的runtimeClassName替换为NSMutableDictionary(或任何其他Foundation或UIKit类)而不是MyCustomObject,则一切都能完美地工作,但我确实需要使用自己的MyCustomObject类。
附注:对于所有对开发类似插件感兴趣的人们,我会在sensiblecocoa.com(使用该插件的框架)上发布所有我的发现,并且会详细介绍。