17

ユニバーサルアプリに問題があります。BaseSDKをiPhone3.2に設定し、ターゲットを3.1に設定しました。

UIPopoverControllerを使用しているファイルを独自のファイルに移動しましたが、iPhoneにアプリをロードするときにロードされるべきではありません。それでも、アプリをビルドすると、デバイスをビルドしてデバッグするときに次のエラーが発生します。

dyld:シンボルが見つかりません:_OBJC_CLASS _ $ _ UIPopoverController参照元:/var/mobile/Applications/B3B90643-92DC-4E5C-8B2F-83A42D6D57E0/citybikes.app/citybikes予期される場所:/System/Library/Frameworks/UIKit.framework/UIKit /var/mobile/Applications/B3B90643-92DC-4E5C-8B2F-83A42D6D57E0/citybikes.app/citybikes

誰かが私を助けてくれることを本当に願っています。

よろしく、ポールピーレン

4

2 に答える 2

27

それらが実行時にロードされない場合でも、それらのファイルはリンクで処理されます。したがって、シンボル_OBJC_CLASS_$_UIPopoverControllerは動的リンクを必要とするものの1つとしてアプリに追加されます。

2つの回避策があります。

  1. [UIPopoverController alloc]メッセージ(例)内のUIPopoverControllerのすべての外観をNSClassFromString(@"UIPopoverController")またはに置き換えます
  2. UIKitを弱くリンクさせます。
于 2010-06-09T09:17:47.240 に答える
5

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];
}

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

于 2011-10-20T07:19:05.573 に答える