Interface Builderはを認識しMyClass
ていますが、アプリケーションの起動時にエラーが発生します。
これは、MyClass
がライブラリの一部である場合に発生し、アプリケーションのターゲットでクラスを直接コンパイルした場合には発生しません。
Interface Builderはを認識しMyClass
ていますが、アプリケーションの起動時にエラーが発生します。
これは、MyClass
がライブラリの一部である場合に発生し、アプリケーションのターゲットでクラスを直接コンパイルした場合には発生しません。
回答:
実行時に「不明なクラスMyClass in Interface Builder file。」エラーが出力されるにもかかわらず、この問題はInterface Builderではなく、コードを直接使用しないためクラスをリンクしていないリンカーに関係しています。
(.xibからコンパイルされた).nibデータが実行時にロードされると、 MyClass
、文字列を使用して参照される場合、リンカはコードの機能を分析せず、コードの存在を分析するだけなので、そのことはわかりません。他のソースファイルはそのクラスを参照しないため、実行可能ファイルを作成するときに、リンカーは存在しないように最適化します。したがって、Appleのコードがそのようなクラスをロードしようとすると、それに関連付けられているコードを見つけることができず、警告が出力されます。
デフォルトでは、Objective-Cターゲットには-all_load -ObjC
すべてのシンボルを保持するフラグがデフォルトで設定されています。しかし、私はC ++ターゲットから始めて、それを持っていませんでした。それにもかかわらず、私はこれを回避する方法を見つけました。これにより、リンカーを積極的に保ちます。
私が最初に使用したハックは、次のような空の静的ルーチンを追加することでした。
+(void)_keepAtLinkTime;
これは何もしませんが、次のように一度呼び出します。
int main( int argc, char** argv )
{
[MyClass _keepAtLinkTime];
// Your code.
}
これにより、リンカはクラス全体を保持するようになり、エラーは消えます。
jlstreckerがコメントで指摘したように、_keepAtLinkTime
メソッドを追加する必要はありません。次のような既存のものを呼び出すだけです。
[MyClass class];
トリックを行います(から派生する限りNSObject
)。
もちろん、コードの任意の場所でこれを呼び出すことができます。私はそれが到達不能なコードであることもあると思います。リンカーをだまして、MyClass
どこかで使用されていると思わせることで、最適化にそれほど積極的ではありません。
ビューの迅速な定義。必ずオーバーライドしてくださいinit(coder aDecoder: NSCoder)
。ビューコントローラーのObjective-C定義。そして、梨の木のペン先。
クラスを選択するNib詳細インスペクターにモジュール名を追加します。
MyClass
。ちょうどそれから継承するメソッドを呼び出すNSObject
ように、+class
。
MyClass.m
に、ファイルインスペクターの[ターゲットメンバーシップ]セクションで必要なすべてのターゲットを確認できます。
Lauraの提案に従って修正しましたが、ファイルを再作成する必要はありませんでした。
XCode 4を使用して、プロジェクトナビゲーターで、問題のあるクラスを含む.mファイルを選択します。
[表示]-> [ユーティリティ]-> [ファイルインスペクタの表示]に移動します
(これにより、ファイルインスペクタが右側に表示され、.mファイル情報が表示されます)。
を開く ターゲットメンバーシップ]セクションをこの.mファイルにターゲットが選択されていることを確認します
.mファイルをプロジェクトに追加したときに、なんらかの理由でデフォルトのターゲットに追加されなかったため、指定したエラーが発生しました。
これは実際にはInterface Builderとは何の関係もありません。ここで起こっていることは、Xcodeによって静的ライブラリからシンボルが読み込まれていないことです。この問題を解決する-all_load -ObjC
にはOther Linker Flags
、プロジェクト(および場合によってはターゲット)のビルド設定のキーにフラグを追加する必要があります。
Objective-Cはクラスごとに1つのシンボルしか生成しないため、-ObjCフラグを使用して、リンカーにクラスのメンバーもロードさせる必要があります-all_load
。また、リンカーフラグを追加して、静的ライブラリからすべてのオブジェクトを強制的に含める必要があります。遅かれ早かれこれらのフラグをスキップすると、unrecognized selector
ここで確認したようなエラーまたは他の例外が発生します。
-ObjC
私の場合、フラグだけで修正されたことがわかりました。
-ObjC
問題を修正するには、使用するだけで十分です。
今日、Swiftを使用してこの問題に遭遇しました。
クラスModel.h + Model.m
をに変更しましたModel.swift
。このオブジェクトは、Interface Builderで使用されましたclass = Model
。
オブジェクトを置き換えるとすぐに、クラスをロードできなくなりました。
私がしなければならなかったことは、IBのクラス参照を次のように変更することでした。
Class = Model
Module =
に
Class = Model
Module = <TARGETNAME>
あなたが見つけるでしょう <TARGETNAME>
ビルド設定で。また、生成されたSwiftヘッダーに表示される名前でもあります。#import "TARGETNAME-Swift.h"
Module
名前はドロップダウンにありました。それが私のアプリの名前でした。
[ProjectName]に移動してクリックし、[ビルドフェーズ]タブに移動して、[ソースのコンパイル]をクリックし、[+]ボタンをクリックすると、ウィンドウが表示され、[MyClass]を選択します。 m "ファイルをクリックし、[追加]をクリックします。
プロジェクトをビルドして実行すると、問題は確実に解決されます
これはXcode4キャッシュの問題です。/Users/your_user/Library/ApplicationSupport / iPhone Simulator / 4.3 / Applications /の下のすべてのフォルダーを削除するだけです
また、iPhoneで同じ問題をテストしている場合は、古いアプリを削除してから実行してください...
幸運を。パスカル
IBuilderが失敗した customModule="AppName" customModuleProvider="target"
これを修正するには、ソースコードとしてストーリーボードを開き、次の行を置き換えます。
<viewController storyboardIdentifier="StoryboardId" id="SomeID" customClass="CustomClass"
sceneMemberID="viewController">
これに:
<viewController storyboardIdentifier="StoryboardId" id="SomeID" customClass="CustomClass"
customModule="AppName" customModuleProvider="target" sceneMemberID="viewController">
customModule="MyFrameworkName"
。巨大な+10
私のケース-私の目的のcプロジェクトで迅速なフレームワークからクラスを使用しようとすると、このエラーが発生しました。解決策は、以下に示すように、Interface builder / StoryboardにクラスのModule(swiftフレームワーク)を追加することでした。他には何もない
私の場合、存在しなかったクラスのエラーが表示されていました!ストーリーボードファイルに含まれているものだと思いました。エラーのクラスファイルを認識できない場合は、これを試してください:
1)プロジェクトを崇高なまたは別の優れたエディターで開きます。参照されているクラスを検索します。2)言う全体を削除します
customClass="UnrecognizedClassName"
3)保存します。4)xcodeに戻ってプロジェクトをクリーンアップし、今すぐ実行してみます。
私のために働いた。
customClass="MyCla"
。カスタムクラスの割り当てを削除する代わりに、最初に使用する予定のクラスを単純に配置するのが賢明でした:)
ここでのすべての答えではないにしても、ほとんどの答えはクラスが実際に存在すると想定しているので、私はこの答えを追加したいだけです。リンカー/コンパイラがそれを見るには馬鹿げているというだけです。クラスの「ハック」を作成するか、それを「強制」するハックを作成します。
私の問題は、このメッセージが実際には存在しないクラスについて話しているときに発生します。そのため、例として、古いgitに戻すことが挙げられますとして、特定のクラスを認識していないリビジョンにます。 t存在します。
解決?
あなたはその後行くのが良いはずです
エラーを削除する最善の方法は次のとおりです 。1)クラスファイル(.m)を選択します 。2)「ターゲットメンバーシップ」で、プロジェクト名のエントリを「確認」します。
これを修正するには、class.hと.mからテキストをコピーし、それらのクラスファイルをプロジェクトから削除し、「ファイルの追加」を使用して同じ名前の新しいclass.hと.mファイルを作成します。次に、コードを新しいファイルに貼り付けて戻しました。すべてうまくいきました。どういうわけか、ファイルは作成時に正しくリンクされませんでした。その後、リンカーフラグを使用する必要はありませんでした。
私は最後にこれを修正しました、次のコードを.mファイルに追加するのを忘れていました:
@implementation MyTableViewCell
@end
つまり、.xibファイル内の要素への接続を持つ、テーブルセルのプレースホルダー@interfaceを作成したために発生していましたが、Interface Builderにはバグがあり、クラスに@implementationが指定されていない場合、それを見つけることができません。
コードからコメントアウトしているにもかかわらず、.xibをソースとして表示し、MyTableViewCellを表示する他のフォーラムからすべての手順を実行しました。シミュレータをリセットしてみました。私はすべてのクラスをインターフェイスと同じ名前の別のファイルに分割してみましたが、これまで何も機能しませんでした。
私の経験では、PSは、.h / .mファイルの名前が@interfaceの名前と異なっていても問題ありません。複数の@interfaceを含むファイルがいくつかあり、それらは正常に動作します。
PPS UITableViewCellおよびUICollectionViewCellがこのエラーを引き起こす理由の詳細な説明は、https://stackoverflow.com/a/22797318/539149で、コンパイル時にregisterClass:forCellWithReuseIdentifier:を使用してそれを明らかにする方法とともに説明しています。
これは、.xibが存在しない古いApp Delegateへの古いリンクを取得したために発生します。私はこのようにそれを修正しました:
私はこれを試してみましたが、このサイトにリストされている他の回答もありませんでした。このコメント(から http://www.iphonedevsdk.com/forum/iphone-sdk-development/43330-unknown-class-interface-builder-file.html)は次のことを助けました:
検索して検索した後、ファイルに隠されたこの削除されたクラスの名前をようやく見つけました。インターフェイスビルダーファイルをXコードで開く必要がありました。ファイルを右クリックして、「ソースコードとして表示」を選択しました。それからそれを探して思いついた
<object class="NSMutableArray" key="dict.values"> <bool key="EncodedWithXMLCoder">YES</bool> <string>com.apple.InterfaceBuilder.IBCocoaTouchP lu gin</string> <string>*this was the class name*</string>
その最後の行を削除するだけでは残念ながら問題は解決せず、ファイル内のアイテム数が間違っていると不満を漏らします。その上の行のセクションから対応する行を削除する必要がありCustomClass
ます。これはを参照しています。
プロジェクト設定だけでなく、ターゲット設定でも-all_load -ObjCフラグを追加する必要があります。
私はSwiftでこれに遭遇しました。
.xibファイルをプロジェクトのBase.lprojフォルダーに移動すると、このエラーは解消されました。
このエラーは今日、aaLuminateアプリをXcode 4でUniversalに変換するときに発生しました。このアプリはユーティリティテンプレートに基づいており、もともとXcode 3でビルドされていました。
時間を節約するために、iPhoneのメインビューとフリップサイドビューをユニバーサルアプリの適切な名前にコピーしました。「インターフェイスビルダーファイルの不明なクラスx」エラーが発生しました。私の場合、XIBファイルやターゲットには何もありませんでした。
他の理由でaaLuminate-Info.plistファイルもコピーしました。これには、古いキー「メインnibファイルのベース名」がMainWindowに設定されていました。
このキーを削除するとすぐに問題が解決しました!
私の場合、新しいプロジェクトを作成していくつかのソースファイルを削除し、作業中のプロジェクトから同じ名前のソースファイルをコピーすることで、いくつかの作業を保存しようとしたため、このエラーが発生しました。RootViewControllerを探していたMainStoryBoardファイルもコピーしました。ただし、元のRootViewControllerを削除してから、以前の製品のRootViewControllerに追加した場合、上記のように、ファイルの追加操作でターゲットボックスを「チェック」できなかったことが明らかです。newleyがインポートしたすべての「.m」ファイルを確認し、ターゲットメンバーシップボックスがチェックされていることを確認するだけで、すべてが順調でした。ターゲットメンバーシップがチェックされていないため、ストーリーボードファイルがリンクから「除外された」クラスを探していたことが原因だったと思います。ターゲットに必要なファイルがファイルインスペクターのターゲットメンバーシップで指定されていることを確認することで、うまくいきました。パットありがとう!(上記を参照)
私の場合、UITableViewセルのサブクラスのサブクラスを.hファイルで宣言しましたが(両方のサブクラスの宣言は同じ.hファイルにありました)、その2番目のサブクラスの空の実装を.mファイル。
.hファイルで宣言したサブクラスのサブクラスを実装することを忘れないでください!シンプルに聞こえますが、.h / .mファイルごとに1つのクラスで作業している場合、Xcodeがこれを行うため、忘れがちです。
RateViewがUIViewのサブクラスである "インターフェイスビルダーの不明なクラスRateView"がありました。UIViewをストーリーボードシーンにドロップし、カスタムクラスフィールドをRateViewに変更しました。それでも、このエラーが表示されました。
デバッグするために、クラスの名前をRateView2に変更し、UIViewのカスタムクラスフィールドを除くすべての参照を一致するように変更しました。エラーメッセージは、RateViewが不足しているクラスとして以前と同様に表示されました。これにより、エラーメッセージがカスタムクラスフィールドの値に関連していることが確認されました。この値をRateView2に変更し、エラーメッセージを「インターフェイスビルダーの不明なクラスRateView2」に変更しました。ソートの進行状況。
最後に、ファイルインスペクタでソースコードファイル自体を検査しました。そこで、チュートリアルからコピーしたソースコードファイルがターゲットに関連付けられていないことがわかりました。つまり、ターゲットメンバーシップがありませんでした。クラスのソースコードファイルをターゲットアプリのメンバーにするチェックボックスをオンにしたところ、エラーメッセージは表示されなくなりました。
ターゲットのビルドフェーズの下にファイルを追加し、問題は解決しました。ファイルを追加する手順については、私の答えを参照してください:
これは少し気が狂いましたし、上記の提案のどれも私がエラーを取り除くのに役立ちませんでした。幸い、クラスを使用するIBオブジェクトは1つしかなかったので、それを削除して、同じクラスを指定して追加し直しました。エラーがなくなりました...