7

Xcode のObject Libraryペインにカスタム オブジェクトを追加するために、独自のカスタム Xcode .ideplugin を開発しました。IBMyCustomObject という名前のクラスに基づいたカスタム オブジェクト テンプレートがあり、これには、MyCustomObject という名前のクラスの runtimeClassName があります (ランタイム クラス名は、Xib ファイルが読み込まれるときに実行時にインスタンス化されるクラスの名前です)。 .

たくさんの研究の後、私はこれをうまく機能させることができました。カスタム オブジェクトを [オブジェクト ライブラリ] ペインから Xib ファイルに通常どおりドラッグ アンド ドロップし、インスペクタ ペインでオブジェクト プロパティを設定すると、他のすべてがうまく機能します。唯一の問題はコンパイル時にibtool発生し、Xib ファイルのコンパイル時に Xcode で次のエラーが表示されます。

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 を MyCustomObject の代わりに NSMutableDictionary (またはその他の Foundation または UIKit クラス) に置き換えると、すべてが完全に機能しますが、代わりに独自の MyCustomObject クラスを使用する必要があります。

PS: 同様のプラグインの開発に関心のあるすべての人のために、すべてを理解したら、sensiblecocoa.com (プラグインを使用するフレームワーク)の詳細なブログ投稿にすべての調査結果を掲載します。

4

1 に答える 1

6

Xcode (より具体的には ibtool) がコンパイル時に「Interface Builder Cocoa Touch Tool」と呼ばれるまったく新しいプロセスを生成していることがわかりました。これは、MyCustomClassバンドルをロードしても効果がなかった理由を説明しています。私が考えた解決策の 1 つは、dylib インジェクションを使用MyCustomClassして新しく生成されたプロセスにライブラリを挿入することでしたが、堅牢で安定した実稼働コードに十分な信頼性を備えた手法は見つかりませんでした。

最終的に、完全にコンパイルされたNSMutableDictionaryの代わりに使用することになりました。MyCustomClass次に、オブジェクト オーナー クラスで setter プロパティ メソッドを使用して、ロードさNSMutableDictionaryれた を に変換しMyCustomClass、すべてのディクショナリ キーをそれぞれのプロパティに手動で割り当てました。前に言ったように、sensiblecocoa.comブログ ページにすべてのプラグイン開発の詳細を投稿します。

于 2013-08-29T15:19:30.430 に答える