Xcode 4.5.2では次の警告が表示されます。
Unsupported Configuration
Scene is unreachable due to lack of entry points and does not have an identifier
for runtime access via -instantiateViewControllerWithIdentifier:.
残念ながら、私は犯行現場を特定できません。 Issue Navigatorで警告を選択しても、ストーリーボードでは何も強調表示されません。かなり複雑なストーリーボード(30以上のシーン)があります。
助言がありますか?
このスレッドは古いですが、私にとって何がうまくいったのかを説明する答えがありませんでしたので、ここに行きます...
このエラーが発生し、ストーリーボードを視覚的に調べたところ、すべてのView ControllerがルートView Controllerに接続されているように見えました。
ストーリーボードで17個のView Controllerすべてに名前を付けてみました(@bobnobleの答えのように)。 View Controllerの長い名前に基づいた命名規則を使用しました。 「Jobs View Controller」の「jvc」。ビルドしようとしたときに、View Controllerの1つが重複した名前を持っていることを示すエラーメッセージが表示されました。物事を追跡すると、実際にduplicateが双子の上に正確にスタックされているビューコントローラーがあることがわかりました。私は完全に取り消さなかったユーザーインターフェイス実験からのカットアンドペーストの損傷であると思われます。
とにかく、接続されていない双子を削除することで問題が解決しました。その後、コードで参照されていないVC名をすべて削除しました。
ストーリーボードで、各View Controller(下の画像の赤い矢印)を選択し、ストーリーボードIDフィールド(赤い楕円形)を確認します。ストーリーボードIDフィールドは空白にしないでください。あるものを見つけたら、それが犯人です。
単純なシングルシーンストーリーボードでこの正確なエラーが発生したため、ストーリーボードの1つのView Controllerの[Is Initial View Controller]チェックボックスをオンにするだけで修正できました。この状況では、デフォルトでこのボックスをチェックするためにXcodeが使用されたと思われますが、現在はそうではありません。
ストーリーボードのView Controllerの1つだけをチェックすると、うまくいくはずです。
30個すべてを調べて、それらがStoryboard IDを持っているか、そのView Controllerにセグエを持っているかどうかを確認する必要があると思います。 2つのうちの1つが必要ですが、両方ともオプションです。
この問題は、次のいずれかのシナリオで発生する可能性があります。
ケースI:ストーリーボードのどのシーンも"isInitialViewController"としてマークされていない場合。
修正:ルートView Controllerを特定し、SBで"isInitialViewController"としてマークします。この場合、ストーリーボードIDは必須ではありません。
ケースII
ストーリーボードにinitialViewControllerを配置する必要がない場合があります。例:複数のストーリーボードを使用する場合。
修正:このような場合、"storyboard id"が正しく指定されていることを確認し、このidを使用してストーリーボードで使用される最初のシーンを参照します。例えば:
UIStoryboard *myStoryBoard = [UIStoryboard storyboardWithName:@"MyStoryBoardName" bundle:nil];
MyViewController *myViewController = (MyViewController *)[myStoryBoard instantiateViewControllerWithIdentifier:@"MyViewControllerId"];
この場合、"ストーリーボードID"は必須です。
ケースIII
InitialViewControllerが接続されています。それでも、この警告は表示されます。これは、ストーリーボードの一部のシーンが"セグエ"で接続されておらず、また"storyboard id"がないためです。ストーリーボードをスキャンして、"segue"が必要かどうかを確認してください。欠落している場合はセグエを接続します。セグエが不要な場合は、上記のサンプルコードに示すように、コードからシーンを参照する唯一の方法であるため、必ず"storyboard id"を指定する必要があります。
お役に立てれば
同じ問題がありました。ストーリーボードには、ナビゲーションとTab Bar Controllerを使用して多くのビューがあります。私にとっては、いくつかのビューが接続されていないことを知らせることは単なる警告でした。 すべてのビューが何らかの方法でルートView Controllerに接続されていることを確認してください。私はこのプロジェクトをゼロから開始してこの警告をなくし、ビューが接続されていないときに同じ警告に気付きました。
問題のシーンを見つける最も簡単な方法:
左側のパネルの検索ボタンの隣にある課題ナビゲーターに移動し、エラーをダブルクリックします。ウィンドウの中央に問題のあるシーンを含むウィンドウがポップアップ表示されます。
(これは実際には一般的に真実です-エラーをダブルクリックすると、一般にエラーが中心に表示されるポップアップになります-巧妙な小さなトリック!)
補足:ナビゲーションコントローラーのルートビューコントローラー(初期ビューコントローラー)であるシーンに対して、XCodeがこのエラーを誤って表示することがあります。簡単な修正方法は、このルートビューコントローラーにストーリーボードIDを与え、コンパイル(エラーはなくなるはずです)してから、ストーリーボードIDを削除することです(もうエラーはありません)。
Xcode 7では、これを簡単に処理できます。問題のあるシーンを見つけるためにすべてのシーンを手動で確認する必要はありません。最初にレポートナビゲーターに移動します。ここで、既知の問題に関する詳細情報を取得できます。問題の説明は次のようになります。
Base.lproj/Main.storyboard:fPh-fe-F5F:警告:エントリポイントがないためシーンに到達できず、-instantiateViewControllerWithIdentifier:を介したランタイムアクセスの識別子がありません。
この情報を使用して、オブジェクトID(この場合はfPh-fe-F5F)をコピーし、ワークスペースでこの文字列の出現を検索できます。文字列はMain.storyboardファイルにあります。検索結果をダブルクリックすると、選択したシーンでMain.storyboardが開きます。問題のあるシーンがわかったら、ストーリーボードIDを設定するか、「初期ビューコントローラーである」を設定することで、問題を簡単に修正できます。
私にとっては、Storyboard ID
やSegue
が原因ではありません。 View Controller's Custom Class
を設定していなかったため、この警告を受け取っていました。
Storyboard
でView Controller
を選択し、Utilities Pane
でIdentity Inspector
アイコンを選択します。 Custom Class
の下で、Class
フィールド内の値を確認します。
UIViewController
と表示されている場合は、クラス名を入力する必要があります。これは、カスタムUIViewController
サブクラスを構成する.h
および.m
ファイルの名前になります。
この問題の原因となっているコントローラーまたはシーンを確認する最も簡単な方法は、次のとおりです。
.storyboard
をCtrlキーを押しながらクリックし、Open As > Source Code
を選択します。これにより、ストーリーボードの基になるXMLが表示されます。さて、私の場合、「不快なシーン」には識別子とセグエがあったため、警告は特に面倒でした!シーンを削除してから削除を元に戻すことで、問題を解決できました。エレガントではありませんが、機能しました。これを行う前に、ストーリーボードを保存しました。振り返ってみると、私はコピーを作成し、diff
をビフォーアフターにしたはずです。
今日この質問に来ました。私はXcode 6.3を使用していますが、OPの質問に対する答えは非常に簡単です:
最初のものにしたいView Controllerを選択し、Attributes Inspectorを表示し、View Controllerセクションの下で、
初期View Controllerです
チェックされます。ほら!
識別子を設定するだけです。右ペインの属性インスペクターに、「ID」というフィールドがあります。そこに任意の文字列を置くだけで、これは動作するはずです
Navigation Controllerをクリックし、属性インスペクターの下にある[初期ビューコントローラーです]ボタンをクリックすると、これも機能するはずです。
私は同じ問題に直面し、すべてのviewControllerとNavigationControllerの識別子もストーリーボードIDに入れて解決しました。エラーはすぐに削除されます
楽しい!!!
すべてのMVCにストーリーボードIDを与えるだけでうまくいきました。
たぶん、このXQueryはそれらの厄介なシーンを見つけるのに役立ちます
for $i in .//scene/objects/*[1][not(@storyboardIdentifier) or @storyboardIdentifier= '']/@id (: find every scene that has an empty storyboardIdentifier :)
where count(.//segue[@destination= $i])= 0 and $i!= ./document/@initialViewController (: filter the results to the scenes that are not destinations of a segue and exclude the initialViewController :)
return ($i, $i/../@customClass) (: return the storyboard-id and the customClass, if any :)
Xqillaがインストールされている場合、クエリをファイルに保存し、次のように使用します。
xqilla <xqueryfile> -i <path to your storyboard>
私は同じ問題を抱えていましたが、コンテナビューを使用していることを認識し、デフォルトのView Controllerを削除する代わりにそのセグエを削除しました。したがって、これは、コンテナビューのデフォルトビューコントローラが不要なときに適切に削除されない場合に警告がポップアップするケースの1つです。
同じエラーが発生しました:私にとっては、ストーリーボードでView Controllerを開始しなかったというエラーです。
その警告を削除する修正。
Storyboardに何も設定されていないUIViewControllerがある場合、この警告が表示されます。 Storyboard IDを設定することで、この警告を回避しました。
ここに私のために働いたものがあります:
上記のすべてを試してみましたが、役に立ちませんでした。 IBですべてが正しく接続され、UIViewController
が1つだけルートビューコントローラーを指定しました。識別子はありませんでしたが、すべてのコントローラーに追加しました。
警告が消える唯一の方法は、上記のすべて(コンピューターの再起動とクリーンビルドを含む)を実行することでしたthen gitでプロジェクトのエラーのないブランチに切り替えてから再び戻ります。
どのアクションがそれを修正したか、またはどのアクションの組み合わせかはわかりませんが、それ自体はクリーンビルドではありませんでした。これは、単に開かれたときに常に変化するMain.storyboardの副産物である可能性があります。つまり、git commit -m "Stupid storyboard"
を頻繁に行う必要があります。
これがまだ言及されていないかどうかはわかりませんが、この警告を受け取ることができるもう1つの理由は、セグエが間違った方向に進んでいる場合です。たとえば、私のプロジェクトではこの警告が出ていましたが、実際にはすべてのコントローラーが接続されていました。ただし、そのうちの1人には、基本的には、子を提示する親ではなく、子から親を提示しようとするセグエがありました。これにより、同じ警告が発生しました。