Xcode 6バグ:Interface Builderファイルの不明なクラス


600

Xcode 6ベータ4にアップグレードした後、アプリが継続的にクラッシュしてメッセージが表示される

Interface Builderファイルに不明なクラスXがあります。

Xcodeがストーリーボードでリンクしたカスタムクラスを見つけられないため、クラッシュしますが、Xcodeインターフェイスで正しくリンクされていることを示しています。

私はすべてが正しくリンクされていると確信しています。私の他の唯一のオプションは、ストーリーボードファイル全体を削除して、なんらかの方法で破損している可能性があるため、最初から始めることです。

編集:クリーニング、シミュレーターのリセット、ビルドフェーズのいじりなどを試したことも付け加えておきます。



1
@ImreKelényiあなたは正しいです。これは、先ほど説明したことを行った後、最近再び起こりました。
エピックバイト

これは私のために働きました、stackoverflow.com
questions / 1725881 /…

それは私にとってタイプミスでした。コントロール要素にデバッグし、それが来るまで選択してください。表示コントローラー> IDインスペクター>カスタムクラス>クラス。そのクラスが定義されていない場合は削除してください。
マーベリックス2015

9
ご注意ください!この「エラー」は、さまざまな原因で発生する可能性があります。受け入れられた回答がうまくいかない場合は、下に移動して次の回答を試してください。私の状況に対する正解は5番目の答えでした。
ジャクソンkr 2016

回答:


1454

質問を入力しているときにこの問題を解決しました。私は自分の質問に答えて、Xcode 6ベータ4を使用しているときにこの問題に直面する可能性のある他の人のためにここに置いておきます。

この問題を解決するには、ストーリーボードでカスタムクラスオブジェクトをそれぞれ選択する必要があります(これには、カスタムビュー、さらにはカスタムビューコントローラー自体も含まれます)。

次に、これらのオブジェクトを選択してIDインスペクターを開くと、[カスタムクラス]の下に[モジュール]オプションが表示されます。[モジュール]テキストボックス内をクリックし、Enterキーを押します。

それでおしまい!すべてのカスタムオブジェクトの現在のモジュールは、Xcode 6ベータ4で何らかの方法で内部的に誤って設定されている必要がありますが、インスペクターでこれを視覚的に示すものはありませんでした。

モジュールのテキストボックス内でEnterキーを押しても機能しない場合は、右側の矢印を選択して現在のモジュールを手動で選択し、テキストボックスをクリアしてEnterキーを押してください。クラスのテキストボックス内でEnterキーを押すこともできます(通常、これは別の問題を解決するためです)。

これは、物事をより明確にするための画像です。 ここに画像の説明を入力してください


70
私にとっては、「モジュール」の内側をクリックしてEnterキーを押すことが一貫して機能しませんでしたが、「クラス」フィールドを選択して(Enterキーを押して)常に機能しました。
ImreKelényi2014

2
私にとって、ターゲットは正しく設定されましたが、クラスはまだIBに表示されませんでした。しかし、ファイルの「場所」に「グループに対して」ではなく「プロジェクトに対して」というパスが表示されていることに気付きました。ファイル参照とグループを削除し、プロジェクトルートに再度追加するとうまくいきました。
knl 2014年

8
ワオ。このおかげで、他の方法では実現できなかったと思います。これ@objc(...)により、Swiftクラスの1つに追加した後に発生していた問題が修正されました。
ndbroadbent 2014年

12
この問題はXCode 7.2にも存在します。このソリューションは機能しました。
トムファスト

3
これはまだXcode 8.3.1の問題です...そのような恥
Sepehr Behroozi 2017

99

時々Xcodeが見逃した 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">

7
実際、私の場合は削除する必要がcustomModuleProviderありましたが、エラーは解消しました。
Maciej Swic 2015年

3
ギジェルモ、3月末の時点でまだXcodeで発生しています!
Ed Manners、2015年

3
@MaciejSwic削除customModuleProviderしてくれてありがとう、ありがとう!
Sakiboy、2015

1
xibファイルについてはどうですか?
SleepsOnNewspapers 2015

7
まだ起こっています...このようなことで私は泣きたいです:(
ルーク

72

Swiftクラスの名前を変更した後、この問題が発生しました。@objcディレクティブを使用して解決しました。

@objc(ForumTopicListViewController) class ForumTopicListViewController

4
これで問題が解決@objc class X@objc(X) class Xました。
Joe、

1
また、あなたの得られたデータを参照、削除しようとすることができstackoverflow.com/questions/24039932/...
user1760527

シングルビュープロジェクトテンプレートからデフォルトのViewControllerクラスの名前を変更した後、この問題が発生しました。私は魔法のように使用されたのだろうか@objc()...ディレクティブが「元」のViewControllerクラスのために必要とされていなかった
BerendクラインHaneveld

私は反対側に行きます。Storyboardファイルでモジュール名を指定しましたが、@ objcディレクティブも追加しました。
WeZZard

1
うまくいきませんでした。:(どちらモジュール名の作業のソリューションではありません。
mythicalcoder

64

複数のターゲットを持つプロジェクト

私の場合、複数のターゲットを持つプロジェクトで作業していて、「ターゲットから継承」という問題がチェックされていませんでした。「ターゲットから継承」を選択すると問題が解決しました

ここに画像の説明を入力してください


これを投稿してくれてありがとう。私が非常に早く目にした問題を解決しました。
JaredH 2018

私も同じような状況でした。(XCode 9.4.1)MxFileView(MxFileView.swiftとMxFileView.xibで構成される)と呼ばれるカスタムUIViewで、FilesTestAと呼ばれるiOSアプリを作成しました。次に、別のターゲットを追加しました。Todayウィジェット( "FilesTestAWidget")です。ウィジェットでMxFileViewを使用するためのソリューション:(1)class = "MxFileView"; (2)「ターゲットからモジュールを継承する」をチェックします(または、チェックを外して「FilesTestAWidget」を手動で入力します); (3)アプリターゲットで、MxFileView.swiftとMxFileView.xibの両方がターゲットメンバーシップにFilesTestAWidgetを含むことを確認します。
Kenster999 2018

これは、Xcode 10.1のデフォルトテンプレートからの新しいプロジェクトで発生しました(1つのiOSアプリターゲットと2つのテストターゲット)。すべてのカスタムView Controllerのチェックボックスがオフになりました(したがって、プレースホルダーテキストは「なし」でした)。ストーリーボードのすべてのカスタムView Controllerのチェックボックスを確認した後、問題は解決しました。
メイソン

58

これは私のために働いた。

コンパイルされたソースを確認し、そのファイル(例:ViewController.m)が追加されているかどうかを確認します。私の場合、ViewControllerファイルが追加されていないため、エラーが発生しました。

ここに画像の説明を入力してください


@CarmenA「.m」ファイルのみをに追加しますCompile Sources。これは実際には正しい(&のみの)ソリューションです。
Jacksonkr 2016

他の解決策をいくつか試しましたが、うまくいきませんでした。これでうまくいきました。奇妙な理由で、1つのターゲットが適切なソースファイルを1つ欠けていました。
galactikuh 2018年

私にとっても..いくつかの紛争解決のために起こった
Eldhose

46

これは、6.0以上のすべてのXcodeで発生する可能性があります。Swiftプロジェクトの一部のViewControllerクラスの名前を変更した後、それが起こりました(ただし、Obj-Cでも発生するでしょう)。インターフェイスビルダーを開き、クラスの名前を変更したViewControllerのIdentity Inspectorに移動し、クラスを選択してEnterキーを押すだけです。これにより、名前を変更したクラスが選択したViewControllerに再度割り当てられ、クラスの名前を変更した後に失われるモジュール値もリセットされます。

Xcode 8.1の更新(おそらく8.0も):

Xcode 8.1がクラッシュするだけです。単純に不愉快なことに、クラッシュして何も印刷されません。私はそのファントムクラッシュを1時間追跡して、それがこれと非常に同じことである-IBの割り当てられていないクラスであることを確認しました。ファントムクラッシュが発生する場合は、まずIBをチェックして、割り当てられていないクラスがないか確認してください。


これをありがとう。あなたの提案に従うと、Xcodeはモジュールを(IBのクラスの下で)NoneからCurrentに更新するようです。問題は、Enterキーを押すことなく名前を入力するだけでは、Xcodeによるモジュールの更新がトリガーされないことだと考えています。
rockiesGrizzly 16

これでうまくいきました。誤ってコントローラークラスの名前を変更したので、ビューコントローラーが読み込まれたときは明らかに存在しませんでした。
ライトハウス2017年

32

提供しているコントローラーのターゲットメンバーシップが現在のアプリケーションから失われる場合があります。その場合、「モジュール」フィールドでEnterキーを押しても何も起こりません。コントローラーに移動し、ターゲットメンバーシップが現在のアプリに設定されていることを確認します。


これも私にとって問題でした。複数のターゲットが原因で、作成中のターゲットにクラスファイルが誤って含まれていません。
Ryan Kreager、2015

私はファイルをマージし、ターゲットの1つでこれを逃しました、すばらしい答え
ベンジャミンヒメネス

良い例、マージpbxがターゲットメンバーシップの値を壊しました。
システム

32

有効Inherit Module From Targetにすると、正しいターゲットモジュールが取得されました。それで問題は解決しました。

ここに画像の説明を入力してください


確認。これは私が問題を解決するのに役立ちました。
Chris8447

ビューコントローラーをObjective-CからSwiftに変換すると、通常この問題が発生します。最後の文字を再入力してEnterキーを押します。トリックも行う必要があります。
DevNebulae

30

私の答え:添付のスクリーンショットのように、カスタムモジュールをカスタムポッド名(私の例では-カスタムクラス名)に設定します

このソリューションは特定のケース向けです:ポッド(またはCarthage)フレームワークからのカスタムビュークラス。

インフラストラクチャ:XCode8、Swift3

ここに画像の説明を入力してください


18

ChikabuZの提案とは正反対のことをして修正しました(ただし、指摘してくれてありがとう)。ストーリーボードファイルで、次を見つけます。

<viewController storyboardIdentifier="StoryboardId" id="SomeID" customClass="CustomClass" customModule="AppName" customModuleProvider="target" sceneMemberID="viewController">

これに置き換えます:

<viewController storyboardIdentifier="StoryboardId" id="SomeID" customClass="CustomClass" sceneMemberID="viewController">

SwiftコンパイラとXcode 6のバグを回避するのに何時間も費やしているとは信じられません


17

適切なものModuleを選択することで、Custom Classこの問題を解決しました。

ここにあります :

ここに画像の説明を入力してください


13

Xcode 8でこの問題に直面しました。解決するには、テキストエディターでストーリーボードを変更する必要がありました。

一般的には、あなたのコントロールおよび削除のためのルックアップcustomModuleおよびcustomModuleProvider制御エンティティから。

私のためにトリックをしました。


ハァッ!素敵なハック:)
Vexy

10

私も同じ問題を抱えていました。

私の場合、Xcodeはカスタムクラスをターゲットに追加していませんでした。ターゲット>ビルドフェーズ>ソースのコンパイル。

したがって、CustomClass.mが存在するかどうかを確認することをお勧めします。

ここに画像の説明を入力してください

これがお役に立てば幸いです。


これは私に起こったことであり、幸いにも私の道を見つけました!私は答えるためにここに来ましたが、あなたが一番でした。ありがとう!!!
ガブリエルピファレッティ2017年

9

私は削除するとき、私はXcodeの6.1でこの問題に直面しMain.storyboardLaunchScreen.xibファイルおよびデフォルトのViewController私のプロジェクトからクラスを。

私は削除することによってそれを修正Launch Screen FileしてMain InterfaceからエントリをInfo.plist



8

私はこれをどこでもググった。プロジェクトフォルダーをデスクトップに移動するように依頼された1人の男に出会うまで、どの回答も機能しません。自動的に機能しました。どうやら、フォルダを多くのフォルダの奥深くに投影すると、XCODEが実際に壊れてしまいます。


以前にXcode 6で問題が発生したため、Xcode 7ベータ5でもこの問題が発生しました。今回は、この方法でうまくいきます。
ジェイクリン

1
ビジュアルスタジオでも同様の問題があります。しかし、その向こうには、パスが長すぎて追加や編集ができないという明確な警告メッセージが表示されます。XCODEでも同じかどうかはわかりませんが、そのエピソードの後、すべてのプロジェクトをドキュメントまたはデスクトップに保存し、この問題が発生することはありません。私はXamarin Studioを使用している誰かにこのアドバイスを与え、それも彼らのために働きました...
VBaarathi

7

これらの手順は私にとってはうまくいきます。

1)派生データを消去します。
2).hおよび.mファイルを削除する
3).hおよび.mファイルを再度作成する


これも私にとってはうまくいきました。派生データを消去せずにそれを機能させました。
jaytrixz 2015

これは私にとってはうまくいきました、Arwinに感謝しますが、それでもクラスやIBで何も変更しなかったため、なぜそのようなエラーが発生するのかはまだ
わかりません。KirtikumarA。2015

7

これを解決するには、ストーリーボードファイルをソースコードとして開き、command-Fを使用して不明なクラスを検索し、それに関連付けられているカスタムクラスを削除します。


6

@gfrsが言ったことは正しいです。モジュールを設定する必要があります。しかし、私のクラスがClassドロップダウンにリストされていないという問題にかつて遭遇しました。最終的には、swiftファイルを削除し、Xcodeを再起動して、ファイルを再作成しました。最後に、クラスがリストされ、ストーリーボードで使用できました。

私が遭遇した「本当の」問題を解決するように見えるこの回答も見てください。


クラスファイルの削除と再追加がうまくいきました。ありがとう!
Nicolas Miari、2015年

6

この問題を解決するには、すべてのViewコントローラーとビューのIDインスペクターのカスタムクラスにモジュール名を入力します(残念ながら、ドロップリストには何も表示されません...)。

ターゲットプロバイダーを指定する必要がある場合もあります。この目的を達成するために、ストーリーボードをソースコードモードで開き、 "customModuleProvider"属性をViewControllerとView山括弧の両方に追加できます。


6

私の解決策(Xcode 8.1 Swift 3.0):

Interface Builderファイルのクラスxxxが不明です。

ソースコードとしてStoryBoardを開き、xxxを検索します。値xxxを含む属性を削除します。ビルドして実行します。


WTF?これは私にとって絶対に必要でした、ありがとう。私は削除しなければなりcustomModule="" customModuleProvider=""
ませんでし

1
このようなエラーが含まれているアプリケーションをアプリストアに公開しようとすると、アプリケーションは意図せずに拒否されます。
ibrahimyilmaz 2017年

同意しません。この方法で変更する必要のあるビルドをTestFlightに送信しただけで、ベータテストの準備が整いました。実際のアプリストアで何が起こるか確認しますが、これはIBバグIMOです。ありがとう!
Dan Rosenstark 2017年

4

私の場合、私はフラグを追加-ObjCOther Linker Flags、それを動作させるために、プロジェクトの設定で。また、-all_loadフラグを使ってみましたが、うまくいきました。

ここに画像の説明を入力してください


3

私の場合、ストーリーボード/ xibで参照されるクラスには、ターゲットメンバーシップが設定されていませんでした。

修正するには、そのクラス.h.mファイルに他のクラスと同じターゲットメンバーシップを与えます。

ターゲットメンバーシップが設定されていません。


これが私の問題でしたが、さまざまな解決策を試しているときに、Epic Byteの回答が修正されるという問題が発生しました。ビルドしているターゲットにソースコードが必要ですが、IBでも、ビューコントローラーを現在のターゲットの一部になるように設定する必要があります。
SafeFastExpressive 2017

ターゲットのメンバーシップも私の問題で、どこにでもありましたが、この回答のおかげで解決できました。
ボルジ2017


2

ストーリーボードをSwiftプロジェクトからObjective-cプロジェクトに移植したときに問題に直面しました。vvkuznetsovの回答に気づき、2つのプロジェクトが同じ識別子を使用していることがわかりました。「製品->クリーン」と入力し、「モジュールとクラス」テキストフィールドのEnterキーをタップします。問題はなくなりました。


2

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

XCode 4を使用して、プロジェクトナビゲーターで、問題のあるクラスを含む.mファイルを選択します。

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

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

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


2

私の問題はユーザーエラーでした。ストーリーボードとIdentity InspectorのCustom Classセクションに汎用のUIViewがあり、誤って名前をUIViewから意味不明に変更しました。

修正に必要なのは、UIViewに戻すだけでした。


同じことを行いましたが、誤ってカスタムビューコントローラーの名前をViewControllersルートビューのカスタムクラスセクションに追加しました。だから、ずっとルートビューだったのになぜビューコントローラーが見つからなかったのか見てみました。
TM

1

私のためだけに働いたのは、実際にはモジュール名をxibファイルに追加することです...

すごい、xibファイルは次のようになります。

mymodule.MyViewController.xib (Module being the name of the proyect, usually)

私の考えでは恐ろしい解決策ですが、おそらくそれがAppleが私たちに今それを実行してほしいと望んでいる方法です。

この質問は、ベータ4に戻って3つの可能な回避策を示しています...明らかにAppleは、「意図したとおりに機能している」と呼んでいるため、この状況ではあまり役に立たなかったようです。


1

Xcodeバージョン6.1(6A1052d)でも同じ問題が発生しました。App / Xcode Projectの名前を変更すると問題が発生すると思います。

私の解決策は、インターフェイスビルダーでモジュール名を手動で追加することでした。


1

新しいターゲットを追加し、[新しいファイル]ダイアログを使用して新しいクラスを作成した後、この問題が発生しましたが、作成ダイアログで新しいターゲットと元のターゲットを誤ってチェックできなかったため、オブジェクトは元のターゲット。解決策は、ソースファイルを削除し(参照のみを削除)、[ファイルの追加]を使用してそれらを追加し直すことです。今回は両方のターゲットをチェックします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.