iPhone テストのユニバーサル iPhone/iPad アプリケーション デバッグ コンパイル エラー

StackOverflow https://stackoverflow.com/questions/2618889

質問

Xcode 上の iPad シミュレーターで問題なく動作する iPhone および iPad ユニバーサル アプリを作成しましたが、今度は iPhone の機能をテストしたいと思います。iPhone シミュレータは常にデフォルトで iPad になるため、このコードでは iPhone シミュレータを実行できないようです。

代わりにデバイス上で実行しようとしたところ、実行が開始されると次のエラーが発生しました。

dyld: Symbol not found: _OBJC_CLASS_$_UISplitViewController
  Referenced from: /var/mobile/Applications/9770ACFA-0B88-41D4-AF56-77B66B324640/Test.app/Test
  Expected in: /System/Library/Frameworks/UIKit.framework/UIKit in /var/mobile/Applications/9770ACFA-0B88-41D4-AF56-77B66B324640/Test.app/TEST

アプリは XIB を使用するのではなくプログラムで構築されるため、main.m メソッドの次の行を使用して 2 つのデバイス ロジックを分割しました。

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
{
    retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate_Pad");
}
else
{
    retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate_Phone");
}

その時点から、彼らは別の AppDelegate を使用し、ヘッダーをチェックして、UISplitView が決して使用されず、Phone ロジック経由でインポートされていないことを確認しました。

このエラーを回避するにはどうすればよいですか?また、このプログラムで作成されたアプリのユニバーサル ロジック パスを分割するより良い方法はありますか?

役に立ちましたか?

解決

あなたは、弱いリンクUIKitフレームワークをしなかったため、

というエラーがトリガされています。 iPhone OS 3.2を追加UISplitViewControllerでUIKitフレームワーク、そしてあなたは、通常のようにそれをリンクする場合、アプリケーションはそうではないところ、これらのシンボルは、3.0に存在すると想定されます。

弱リンクのフレームワークには、それを検査し、Xcodeでアプリケーションのターゲットを見つけ、[全般]タブに進みます。そのタブの下部にあるタイプのためのコラムで、フレームワークのリストでなければなりません。弱に必須からUIKitのためのタイプを変更し、アプリケーションを再構築します。これは、ランタイムエラーの世話をする必要があります。

あなたの条件ロジックが健全であるが、私はアプリケーションデリゲートを共有し、さらにラインの下のインターフェイス固有のレイアウトを行う傾向があります。

(更新:2011年12月21日)のiOS 4.2のように、あなたは、弱いリンクのフレームワークにはもはや必要ではこのようなエラーを防ぐためにすべきです。 マルコ・アーメントで説明するよう、あなたはiOSの4.2でビルド以降およびiPhone OS 3.1以上にまで対象とならば、個々のクラスは、現在の弱いリンクされ、クラスがOSの現在実行中のバージョンに存在しない場合、その+classメソッドの戻りnilを持っている必要があります。

他のヒント

私は非常に同様のエラーを持っていたし、それがナット私を運転していました! :-)時間を検索し、それを把握することができませんでした...

あなたが言ったようにiPadのシミュレータでの実行時に

は、すべてが大丈夫だったが、iPhone OS 3.1.2でiPhone上のAppをテストしようとすると、それも開始したが、次のエラーメッセージを表示してクラッシュしないでしょう。

  

mi_cmd_stack_list_framesないスタックに十分なフレーム

は、コードのほぼすべての行をチェックすることによって、私は問題を引き起こしたUIPopoverController又はUISplitViewController(既に内部二股アプリ固有コード)のような3.2のクラスに割り当てることに気づいた。

だからではなく、すなわちの:ます。

  

infoPopover = [[UIPopoverController ALLOC] initWithContentViewController:infoNavController];

私が書くでしょう。

  

infoPopover = [[NSClassFromString(@ "UIPopoverController")ALLOC] initWithContentViewController:infoNavController];

、それは私の問題を解決しました! (エラーメッセージがあなたのバグはおそらく見つけることができる場所についての手掛かりを与えない場合のデバッグが...とても難しいことができます)。

Xcode 8.3、iPad 2 (非 Retina)、Swift 3 コード

私にとって役に立ったのは次のとおりです。

  • Xcodeを再起動します
  • 「製品 -> クリーニング」を実行します シフト指示K
  • プロジェクトを再構築する
scroll top