質問

ユニバーサル アプリで問題が発生しています。ベース 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つありますが、

  1. メッセージ内の UIPopoverController の外観をすべて置き換えます (例: [UIPopoverController alloc]) と NSClassFromString(@"UIPopoverController"), または
  2. 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];
}

移植性のために、私はこれらの実装の詳細を処理するために、プロキシオブジェクトを書いてお勧めします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top