web-dev-qa-db-ja.com

実行時の「Interface Builderファイルの不明なクラス<MyClass>」エラー

Interface BuilderはMyClassを認識していますが、アプリケーションの起動時にエラーが発生します。

これはMyClassがライブラリの一部である場合に発生し、アプリケーションターゲットでクラスを直接コンパイルする場合は発生しません。

259
jhoule

Interface Builderファイルの不明なクラスMyClass。」エラーが実行時に出力されるにもかかわらず、この問題はInterface Builderとは関係なく、コードを使用しないためクラスをリンクしないリンカーとは関係ありません。直接。

.nibデータ(.xibからコンパイルされた)が実行時にロードされると、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がどこかで使用されていると考えさせて、最適化をそれほど積極的にしないようにすることです。

Xcode 6.3.2およびSwift 1.2

ビューの迅速な定義。必ずinit(coder aDecoder: NSCoder)をオーバーライドしてください。 View ControllerのObjective-C定義。そして、ナシの木のペン先。

クラスを選択するNib詳細インスペクタにモジュール名を追加します。

218
jhoule

Lauraの提案に沿ってこれを修正しましたが、ファイルを再作成する必要はありませんでした。

  • XCode 4を使用して、Project Navigatorで、文句を言っているクラスを含む.mファイルを選択します。

  • [表示]-> [ユーティリティ]-> [ファイルインスペクタの表示]に移動します。
    (これにより、右側にFile Inspectorが表示されます。

  • ターゲットメンバーシップセクションを開き、この.mファイルに対してターゲットが選択されていることを確認します

プロジェクトに.mファイルを追加したとき、何らかの理由でデフォルトのターゲットに追加されなかったため、あなたが言及したエラーが発生しました。

183
Pat

これは実際にはInterface Builderとは何の関係もありません。ここで起こっているのは、Xcodeによって静的ライブラリからシンボルがロードされていないことです。この問題を解決するには、プロジェクト(および場合によってはターゲット)ビルド設定の-all_load -ObjCキーにOther Linker Flagsフラグを追加する必要があります。

Objective-Cはクラスごとに1つのシンボルのみを生成するため、-ObjCフラグを使用してリンカーにクラスのメンバーもロードさせる必要があり、-all_loadリンカーフラグを追加して静的ライブラリからすべてのオブジェクトを強制的に含める必要があります。遅かれ早かれこれらのフラグをスキップすると、unrecognized selectorのエラーが発生するか、ここで見たような例外が発生します。

68
Alasdair Allan

今日、Swiftを使用してこの問題に遭遇しました。

クラスModel.h + Model.mModel.Swiftに変更しました。このオブジェクトは、class = ModelとともにInterface Builderで使用されました。

オブジェクトを置き換えるとすぐに、クラスをロードできなくなりました。

私がしなければならなかったことは、IBのクラス参照を以下から変更することでした。

Class = Model
Module = 

Class = Model
Module = <TARGETNAME>

ビルド設定に<TARGETNAME>があります。生成されたSwift-Headerに表示される名前でもあります:#import "TARGETNAME-Swift.h"

26
Besi

「ProjectName」に移動し、それをクリックし、「Build段階」タブに移動し、「ソースをコンパイル」をクリックし、「+」ボタンをクリックして、ウィンドウが表示されたら、「MyClass」を選択します。 m」ファイルをクリックし、「追加」をクリックします

プロジェクトをビルドして実行すると、問題は確実に解決されます

20
Subbu

これはXcode4キャッシュの問題です。/Users/your_user/Library/ApplicationSupport/iPhone Simulator/4.3/Applications /の下にあるすべてのフォルダーを削除するだけです

IPhoneで同じ問題をテストしている場合は、実行する前に古いアプリを削除してください...

がんばろう。パスクアル

19
Ignacio Pascual

時々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">
16
ChikabuZ

私の場合、存在しないクラスのエラーが表示されていました!私はそれがストーリーボードのファイルに埋もれていたのではないかと疑っていました。エラーでクラスファイルを認識できない場合は、これを試してください。

1)崇高な、または他の優れたエディターでプロジェクトを開きます。参照されているクラスを検索します。 2)言うビット全体を削除する

customClass="UnrecognizedClassName"

3)保存します。 4)xcodeに戻ってプロジェクトをクリーンにし、今すぐ実行してみてください。

私のために働いた。

enter image description here

13
smileBot

私の場合-Objective CプロジェクトでSwiftフレームワークのクラスを使用しようとすると、このエラーが発生しました。解決策は、以下に示すように、インターフェイスビルダー/ストーリーボードでクラスのモジュール(Swiftフレームワーク)を追加することでした。他に何もない

enter image description here

13
Dhilip

Build Phases-> Compile Sourcesに移動し、新しい.mファイルを追加します。

13
Jackie Lee

エラーを削除する最善の方法は次のとおりです:1)クラスファイルを選択します(.m)2)「」の下ターゲットメンバーシップ "、" check "プロジェクト名エントリ

9
Amit B

ここにあるすべての答えではないにしてもほとんどのクラスが実際に存在することを前提としているので、この答えを追加したいだけです。クラスの「ハッキング」を作成し、「強制」して存在させます。

私の問題は、このメッセージが実際に存在しないクラスについて話しているときに発生します。たとえば、古いリビジョンgitに戻すことです。特定のクラスの知識がありません..まだコンパイラは、そのクラスが存在しないと文句を言います。

溶液?

  • すべて!最初に、このディレクトリの内容を削除することで、すべてのビルドファイルなどを削除しますall〜/ Library/Developer/Xcode/DerivedData
  • 電話自体からアプリを削除します(シミュレーターを使用している場合は、シミュレーターの内容を消去します)

あなたはその後に行くのが良いはずです

9
abbood

これを修正するには、class.hと.mからテキストをコピーし、プロジェクトからそれらのクラスファイルを削除し、「Add File」を使用して同じ名前の新しいclass.hと.mファイルを作成しました。その後、コードを新しいファイルに貼り付けたところ、すべてうまくいきました。どういうわけか、ファイルは作成時に正しくリンクされていませんでした。その後、リンカーフラグを使用する必要はありませんでした。

8
Laura

私はこれを最終的に修正しました。次のコードを.mファイルに追加するのを忘れていました。

@implementation MyTableViewCell

@end

そのため、.xibファイルの要素に接続するテーブルセルのプレースホルダー@interfaceを作成したが、クラスに@implementationが指定されていない場合、Interface Builderにバグがあり、それを見つけることができません。

コードからコメントアウトしていても、.xibをソースとして表示し、MyTableViewCellを表示する他のフォーラムのすべてのステップを実行しました。シミュレータをリセットしようとしました。すべてのクラスをインターフェイスと同じ名前の別のファイルに分割しようとしましたが、これまでは何も機能しませんでした。

追伸私の経験では、.h/.mファイルの名前が@interfaceの名前と異なっていても問題ありません。複数の@interfaceを含むファイルがいくつかあり、それらは正常に動作します。

P.P.S. UITableViewCellとUICollectionViewCellが https://stackoverflow.com/a/22797318/539149 でこのエラーを引き起こす理由の詳細な説明と、registerClass:forCellWithReuseIdentifierを使用してコンパイル時にそれを明らかにする方法があります。 。

7
Zack Morris

appdelegate applicatoindidfinishlanchingメソッドの開始時に以下のコードを追加するだけで、正常に動作します

[myclassクラス];

6
iSpark

これは、.xibが、もう存在しない古いApp Delegateへの古いリンクを取得しているために発生します。このように修正しました:

  • .xibを右クリックし、[開く]> [ソースコード]を選択します。
  • このファイルで、古いアプリデリゲートを検索し、新しいものに置き換えます
6
S B

私はこれを試みました、そして、このサイトにリストされた他の答え、どれも私のためにそれを分類しませんでした。このコメント( 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を参照する、上の行のセクションから対応する行を削除する必要があります。

5
user776904

私の場合、XCode6があり、指定されたクラス.mファイルはビルドフェーズで間違った場所に配置されます-Compile Sourcesの下にあるはずですが、Copy Bundle Resources

5
Sean Dong

この問題は時代遅れになっていないようです。

Xcode 8でも同じ問題があり、 smilebotのような問題を解決しました

  1. Xcode内で「ソースコード」としてストーリーボードファイルを開きます。

  2. 参照されているクラスを検索し、言う部分をすべて削除します

customClass = "UnrecognizedClassName"

  1. ストーリーボードファイルを「interfacebuilder-storyboard」として再度開き、アプリを再構築します。
4
jaymgee

私は「Interface Builderファイルの未知のクラスfavouritesButton」を持っていて、問題のボタンがIdentity Inspectorの上部にあるClassフィールドに「favouritesButton」という偽のカスタムクラスを持つストーリーブックシーンまで追跡しました。次のフィールドにその値を入れるつもりでした:Identity Label。

これを「UIButton」に変更することで問題を解決しました。

3
Paul Finger

MyClass.mと.hを削除して、それらをプロジェクトに再度追加するだけです。

3
yebw

プロジェクト設定だけでなく、ターゲット設定でも-all_load -ObjCフラグを追加する必要があります。

コアプロット:Interface Builderファイルの不明なクラスCPLayerHostingView

3
S.P.

私はスウィフトでこれに遭遇しました。

.xibファイルをプロジェクトのBase.lprojフォルダーに移動すると、このエラーはなくなりました。

2
jaime

私の場合、ストーリーボードのIDインスペクターで選択されていることに気づかない「viewController」というクラスを削除しました(上の「カスタムクラス」の下)。

IDインスペクタの[カスタムクラス]フィールドでView Controllerの正しいクラスを選択するか、プロジェクトに新しいクラスを追加して、そのクラスをカスタムクラスとして選択するだけです。

私のために働いた!

1
Tim

これにより少し気が狂いましたが、上記の提案はどれもエラーを取り除く助けにはなりませんでした。幸いなことに、クラスを使用するIBオブジェクトは1つしかなかったので、それを削除して、指定された同じクラスで追加し直しました。エラーがなくなりました...

1

Xcode 4でaaLuminateアプリをUniversalに変換すると、今日このエラーが発生しました。このアプリはユーティリティテンプレートに基づいており、もともとはXcode 3で構築されました。

時間を節約するために、ユニバーサルアプリの適切な名前にiPhoneのメインビューとフリップサイドビューをコピーしました。 「Interface Builderファイルの不明なクラスx」エラーが発生しました。私の場合、XIBファイルまたはターゲットには何もありませんでした。

また、他の理由でaaLuminate-Info.plistファイルをコピーしました-これには、MainWindowに設定された古いキー「Main nib file base name」がありました。

このキーを削除するとすぐに問題が解決しました!

1
aarthur

私の場合、.hファイルでUITableViewセルのサブクラスのサブクラスを宣言しました(両方のサブクラスの宣言は同じ.hファイルにありました)が、その2番目のサブクラスの空の実装を作成するのを忘れたためです.mファイル。

.hファイルで宣言するサブクラスのサブクラスを実装することを忘れないでください!単純に聞こえますが、.h/.mファイルごとに1つのクラスを操作している場合、Xcodeがこれを行うため、忘れがちです。

1
horseshoe7

私の場合、新しいプロジェクトを作成してからいくつかのソースファイルを削除し、作業中のプロジェクトから同じ名前のソースファイルをコピーして作業を保存しようとしたため、このエラーが発生しました。 RootViewControllerを探していたMainStoryBoardファイルもコピーしました。ただし、元のRootViewControllerを削除してから以前の製品のRootViewControllerに追加した場合、明らかに、ファイルの追加操作は上記のようにターゲットボックスの「チェック」に失敗しました。単にすべてのニューリーインポートされた「.m」ファイルを閲覧し、ターゲットメンバーシップボックスがオンになっていることを確認するだけで、すべてがうまくいきました。起こっていたことは、ターゲットメンバーシップがチェックされていないために、ストーリーボードファイルがリンクから「除外」されたクラスを探していたためだと思います。ターゲットに必要なファイルが、ファイルインスペクターのターゲットメンバーシップに指定されていることを確認することは、トリックを実行しました。パットありがとう! (上記を参照)

1
Don

ターゲットのビルドフェーズにファイルを追加すると、問題は解決しました。ファイルを追加する手順については、私の答えを参照してください:

Apple Mach-Oリンカーエラー(APActivityIcon)

1
Jamal Zafar

RateViewがUIViewのサブクラスである「Interface Builderの不明なクラスRateView」がありました。 StoryViewシーンにUIViewをドロップし、CustomクラスフィールドをRateViewに変更しました。それでも、このエラーが発生しました。

デバッグするために、クラスの名前をRateView2に変更し、UIViewのカスタムクラスフィールドを除くすべての参照を一致するように変更しました。エラーメッセージは、RateViewが欠落しているクラスとして以前と同様に表示されます。これにより、エラーメッセージがカスタムクラスフィールドの値に関連していることが確認されました。この値をRateView2に変更し、エラーメッセージを「Interface Builderの不明なクラスRateView2」に変更しました。ソートの進行。

最後に、ファイルインスペクターでソースコードファイル自体を検査しました。そこで、ソースコードファイル(チュートリアルからコピーしたもの)がターゲットに関連付けられていないことを発見しました。つまり、ターゲットメンバーシップがありませんでした。クラスのソースコードファイルをターゲットアプリのメンバーにするボックスをチェックすると、エラーメッセージは消えました。

1
Robert White

私の場合、クラスは次のようにフレームワーク内の拡張で定義されたクラスであるため、見つかりませんでした:

extension Buttons {
    public class MyButton: UIButton {
        // ...
    }
}

拡張機能からクラスを抽出すると、Storyboardは最終的にクラス(MyFrameworkButton)を見つけることができました。

extension Buttons {
    public typealias MyButton = MyFrameworkButton
}

public class MyFrameworkButton: UIButton {
    // ...
}
0
Kukiwon

私の場合、カスタムUIViewクラスは組み込みフレームワークにあります。カスタムUIViewヘッダーファイルを「project」から「public」に変更し、マスターヘッダーファイルに含めました。

0
draw

WatchKitでこのエラーが何度も何度も発生しますが、コード内のアウトレットに関連付けられていないユーザーインターフェイス要素がある場合に発生するようです。 WatchKitではこれが必要だと思います。

class InterfaceController: WKInterfaceController {
    @IBOutlet weak var table: WKInterfaceTable!
}

重要な注意:最も外側の要素を接続するだけです。たとえば、行内のラベルなど、テーブル内の何かに接続しようとすると、アウトレットが無効であり、繰り返しコンテンツに接続できないというコンパイラエラーが発生します。

0
Korey Hinton

ここで多くの答えがありましたが、解決策はありませんでしたが、コントローラに無効なカスタムクラスがあったstoryBoardまで追跡しました(名前を変更した後、クラスは存在しません)

0
SAFAD

開発者がIBのcustomModuleフォームを間違えた場合、カスタムクラスではなくUIKitのビューが作成されます。それは重要な問題です。そこで、IBLinterでcustomModuleのリンターを作成しました。 IBLinterのルールの名前は「custom_module」です。 https://github.com/IBDecodable/IBLinter

0
Satoru Fukagawa

関連するすべての.hおよび.mを更新したにもかかわらず、クラス名を変更したときにこのエラーが表示されました。判明したのは、.storyboardファイルの 'customClass'値の更新を見逃していたことです。これで問題は解決しました。

0
Deepa Dhurka

ここで提案のほとんどを成功せずに試した後、クラスの名前を変更してから、xibファイルで手動で名前を変更しました(ソースコードとして開く)。その後、問題はなくなりました。

0
john elemans

上記のソリューションのほとんどを試してみましたが、役に立ちませんでした。 user776904のソリューションを読んだ後、アプリを一から作り直したのと同じ問題を抱えているのではないかと疑ったが、前のプロジェクトからxibファイルをコピーした。 xibファイルには、エラーを引き起こしている古いプロジェクトへの参照が含まれていたので、mainwindow_ipad.xibファイルを削除して、クリーンな新しいプロジェクトから新しいファイルをコピーしただけでした。これで解決しました。そして、ソースコードでxibファイルの一部を変更し始めるのに十分なゲームではありませんでした。

0
timv

私の場合、スペルが間違っている「カスタムクラス」の名前でした。定義したカスタムクラスのストーリーボードを必ず確認してください。

この問題は、ピッカービューを追加してから削除したときに発生しました。それが誰かを助ける場合、私が最終的にそれを解決した方法は次のとおりです:

  1. XCODEでドキュメントアウトラインを開きます(ドキュメントアウトラインとは何ですか?私も知りませんでした-google it .. :))。

  2. ドキュメントアウトラインウィンドウで、警告メッセージを表示するシーンを見つけます。

  3. 問題のあるシーンで、[View]をスタンド(クリック)し、[Utility(google it)]ウィンドウで[IDインスペクター]タブを選択し、カスタムクラス名をデフォルトのUIViewに戻します。

そうじゃない。 :)

0
Yizhar

私の場合、私は非常に愚かな間違いによってこのエラーメッセージを受け取ります。

私は細胞を1000回前に作りました。

0
Tom

インターフェイスビルダー/ストーリーボードからは、利用できないクラスが参照されます。

が既知のクラスである場合、リンクされていません。

がクラスまたは一部の文字ではない場合、おそらくタイプミスです。その場合、この「不明なクラス」のView Controllerのすべてのフィールドを確認してください。 'Identity Inspector'(ブロックの左から3番目の 'Custom Class'は、おそらく間違った値を含む1つのフィールド 'Class'です。通常、フィールドタイプ(UIView/UILabelなど)をリストします。

0
Vincent

アップルのドキュメントごと

64ビットおよびiPhone OSアプリケーションの場合、-ObjCがカテゴリのみを含みクラスを含まない静的ライブラリからオブジェクトファイルをロードできないようにするリンカーのバグがあります。 。回避策は、-all_loadまたは-force_loadフラグを使用することです。

要するに、-all_load「他のリンカー」フラグに追加します「ビルド設定」で、うまくいくはずです。

http://developer.Apple.com/library/mac/qa/qa1490/_index.html

0
Ben Coffman

複数のStoryBoardと、実際には存在しないStoryBoardを使用しているStoryBoardが複数ある場合、実行時にこの「Interface Builderファイルの不明なクラス」エラーが発生します。

0
Sid

同じ名前の新しいプロジェクトを作成し、シミュレータで両方を実行したときに、この問題が発生しました。プロジェクトの1つの名前を変更し、シミュレーターでアプリを削除してから、クリーンおよび再ビルドを実行しました。

0
Amelia777

私の場合、別のプロジェクトのストーリーボードを使用していました。ストーリーボードファイルxml(TextWranglerなど)を確認した後、コントローラーの "customModule" xml属性値の1つが間違っている(古いプロジェクトを参照している)ことに気付きました。これを手動で変更すると、問題が修正されました。

0
FredL

私の場合、問題はIBOutletリンクの停止でした。これが修正されると、すべてが再び正常になりました。

0
Michal Shatz