現在、iPhoneとiPadの両方のiOSアプリケーションを開発しています。 NavigationControllerを表示して、ファイルを表示するモジュールを作成しようとしています。 iPhoneでは問題なく動作しますが、iPadでは動作しません。
次のエラーが発生します。
'Storyboard (<UIStoryboard: 0x919b200>) doesn't contain a view controller with identifier 'FilesNavigation''
そしてこれはコードです:
case 10: // Files
{
UINavigationController *navigationController = [storyboard instantiateViewControllerWithIdentifier:@"FilesNavigation"];
FilesViewController *filesViewController = [storyboard instantiateViewControllerWithIdentifier:@"Files"];
[navigationController pushViewController:filesViewController animated:YES];
self.slidingViewController.topViewController = navigationController;
break;
}
ストーリーボードでは、ナビゲーションコントローラーのストーリーボードIDを既に設定しています。
>##Custom Class
>Class: UINavigationController
>##Identity
>Storyboard ID: FilesNavigation
他のモジュールのスイッチ/ケースブロックの別のケースにこのコードを使用しましたが、iPadでも機能します。初めてこのエラーが発生しました。
私はそれを理解しました、問題はストーリーボードがデバイスで更新されていないことでした。
@ T0m_Twtの回答で述べたように 質問
右側のウィンドウのIDインスペクターセクションで、ストーリーボードIDをナビゲーションコントローラーに提供します。
私はあなたのためにスクリーンショットを撮りました
これは別のケースです:
ローカライズされたストーリーボードが2つあります。必要なビューコントローラを備えているのはそのうちの1つだけです。
偶然にも、iPhone用のストーリーボードとiPad用の別のストーリーボードはありますか?そうした場合、iPadにはその識別子を持つストーリーボードがない可能性があります。また、iPadで実行する場合は、コードにブレークポイントを設定し、「ストーリーボード」オブジェクトが何であるかを確認します。
各プラットフォームのストーリーボードを提供するUIStoryboardのカテゴリを使用します。
[UIStoryboard storyboardHome]を使用できます。これにより、iPadまたはiPhone固有のどちらが必要かが判断され、返されます。また、ストーリーボードが適切な名前に従っていることを確認します。したがって、Home_iPadとHome_iPhoneを使用します。
TL; DR-すべてをクリアし、古いバージョンのアプリがある場合はそれも削除します。
奇妙に聞こえるかもしれませんが、バンドル名も変更したターゲット名を変更した場合、シミュレーター/デバイスにアプリの古いバージョンと新しいバージョンの両方がインストールされている可能性があり、UIStoryboard
インスタンスが一部のビューコントローラーのインスタンス化に失敗しました。これにより、最終的に質問で説明されている問題が発生する可能性があります。それを解決するには、関連するすべてのアプリを削除するか、単にシミュレーター/デバイスをリセットする必要があります。