シンボルが見つかりません:_OBJC_CLASS_$_UIPopoverController
-
25-09-2019 - |
質問
ユニバーサル アプリで問題が発生しています。ベース SDK を iPhone 3.2 に設定し、ターゲットを 3.1 に設定しました。
UIPopoverControllerを使用しているファイルを独自のファイルに移動しましたが、iPhoneでアプリをロードするときにそれらのファイルがロードされるべきではありません。それでも、アプリをビルドしてデバイスにデバッグすると、次のエラーが発生します。
ディルド:シンボルが見つかりません:_OBJC_CLASS_$_UIPopoverController 参照元:/var/mobile/applications/b3b90643-92dc-4e5c-8b2-83a42d6d57e0/citybikes.app/citybikes/system/library/frameworks/uikit.framework/uikit in /var/mobile/applications/b3b90643-92dc-4e5c-8b2f-83a42d6d57e0/citybikes.app/citybikes
誰かが私を助けてくれることを本当に願っています。
よろしく、ポール・ピーレン
解決
実行時にロードされない場合でも、それらのファイルはリンク時に処理されます。象徴 _OBJC_CLASS_$_UIPopoverController
したがって、動的リンクを必要とするものの 1 つとしてアプリに追加されます。
回避策は2つありますが、
- メッセージ内の UIPopoverController の外観をすべて置き換えます (例:
[UIPopoverController alloc]
) とNSClassFromString(@"UIPopoverController")
, または - UIKit を弱くリンクします。
他のヒント
私は強くの のない弱いリンクのUIKitあなたをお勧めします。 KennyTMと私は私たちのコメントで述べたように、これは将来のリンカーの問題を隠し、クラッシュすることがあります。私は単純にもそれがはっきりでないときのUIKitがオプションであることをリンカに伝えるに慣れていませんよ。ビッグハックます。
その代わり、NSClassFromStringを使用して間接的にUIPopoverControllerを初期化して呼び出します
Class popover = NSClassFromString(@"UIPopoverController");
if (nil != popover)
{
self.myPopover = [[popover alloc] initWithContentViewController:myContent];
}
あなたはまだリンカエラーがある場合は、NSSelectorFromStringを使用してUIPopoverControllerのメッセージを呼び出す必要があります:
Class popover = NSClassFromString(@"UIPopoverController");
if (nil != popover)
{
SEL myInit = NSSelectorFromString(@"initWithContentViewController:");
self.myPopover = [[popover alloc] performSelector:myInit withObject:myContent];
}
移植性のために、私はこれらの実装の詳細を処理するために、プロキシオブジェクトを書いてお勧めします。