0

次の回答を読んだので、「Interface Builder ファイル内のクラスが不明です」という-ObjCエラーは、リンカー オプションを使用して解決できることがわかりました。(参考までに、MyClassは静的ライブラリにあります。)

https://stackoverflow.com/a/6092090/534701

オプション[MyClass class]を使用せずに、App Delegate の1 行のコードで同じ問題を処理できることもわかりました。私の質問は、コードが機能する理由です。-ObjC

上に添付した回答によると、静的ライブラリのシンボルが読み込まれていないため、エラーが発生します。[MyClass class]では、リンカーに実行時にシンボルをロードさせるということですか? (これは意味がありません)

4

2 に答える 2

2

リンカーは、未使用のシンボルを削除して、最終的なバイナリ サイズを縮小しようとします。Storyboard からインスタンス化されたクラスはリフレクションを使用して作成されるため、リンカーはそのクラスが使用されているかどうかを知ることができないため、最終的なバイナリから削除されます。

その行をコードに追加することにより、リンカーにそのクラスをコンパイル時に (実行時ではなく) 追加するよう強制し、Storyboard からのリフレクション呼び出しを期待どおりに機能させます。

于 2013-11-09T10:02:19.237 に答える
1

私もこの問題に遭遇しました。受け入れられた答えは私の答えを解決しませんでした。これが私の答えを解決したものであり、それを行うべき実際の方法は次のとおりです。

クラスを選択できるIBでは、クラスの名前を入力する場所のすぐ下に、「モジュール」と呼ばれる別のドロップダウンメニューがあります。ここでは、何も選択しない (Objective-C のクラスの場合) か、事前に入力されたモジュール (通常はアプリの名前) を選択できます。これを行うと、ランタイムは、このクラスが名前付きの Swift モジュールで実行され、それをロードできることを理解します。

これは、Obj-C のみとして開始され、後でいくつかの迅速なクラスが追加されたプロジェクトで機能します。

于 2014-09-13T07:22:23.813 に答える