5

iPadのVGA出力コネクタを使用してアプリのコンテンツを外部画面にミラーリングできるユニバーサルiPad/iPhoneアプリを作成しています。ただし、iPhoneにはこの機能はありません。次のコードが与えられた場合、

#ifdef UI_USER_INTERFACE_IDIOM  
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
    NSLog(@"this code should not execute on iphone");
[[NSNotificationCenter defaultCenter] addObserver:self
         selector:@selector(screenInfoNotificationReceieved:) 
          name:UIScreenDidConnectNotification
           object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
         selector:@selector(screenInfoNotificationReceieved:) 
          name:UIScreenDidDisconnectNotification
           object:nil];
}
#endif

起動時に電話でこのエラーが発生します(iPadでは正常に動作します) "dyld:シンボルが見つかりません:_UIScreenDidConnectNotification"

おそらく、UIScreenDidConnectNotificationが3.13にまだ存在しないためです。実行時にこれを確認するにはどうすればよいですか?

UPDATED は、ipadインターフェイスをチェックするためのifdefステートメントを追加しましたが、同じ結果が得られます!

UPDATEDはNSLogステートメントを追加して、ifステートメント内のコードが呼び出されていないことを確認します。クラッシュは、他のコードが実行される前に発生するようです...

4

4 に答える 4

3

弱いリンク UIKit を試してください。他のリンク フラグに追加します。

-all_load -ObjC -weak_framework UIKit

3.1 より前のデバイスを対象としていて、3.2 にのみ存在するクラスを参照する場合、それらをシンボルで参照することはできません。NSClassFromString を使用する必要があります。しかし、これが不可能な場合もあります。たとえば、そのようなクラスをサブクラス化する場合です (UIPopoverController など)。そのような場合、UIKit を弱リンクする必要があります。フレームワークをウィーク リンクすると、ダイナミック ローダーは起動時にすべてのシンボルを解決しようとします。失敗すると、NULL に設定されます。

定数 UIScreenDidConnectNotification がタグ付けされていない (バグ) と推測しているため、同じ回避策を使用する必要があります。

弱いリンクには欠点があります。起動時に動的にこれを行う必要があるため、起動時間がかかります。遅すぎるかどうかをテストする必要があります。

フレームを弱いリンクにするもう 1 つの方法は、ターゲットで「Get Info」を実行し、[General] タブの下にフレームワークのリストが表示されることです。UIKit のタイプを Weak に変更します。

ところで、#ifdef はコンパイル時の構造であるため、#ifdef を使用したチェックは機能しません。3.2 SDK を使用してビルドしているため、UI_USER_INTERFACE_IDIOM は常に定義されます。

于 2010-04-28T08:23:03.793 に答える
0

http://iphonedevelopment.blogspot.com/2010/04/converting-iphone-apps-to-universal.htmlの「プログラムによるデバイスの決定」セクションに従ってください。

プラス

#ifndef __IPHONE_3_2 // if iPhoneOS is 3.2 or greater then __IPHONE_3_2 will be defined
  typedef enum { // provided by noblemaster ]:-|
    UIUserInterfaceIdiomPhone, // iPhone and iPod touch style UI
    UIUserInterfaceIdiomPad, // iPad style UI
  } UIUserInterfaceIdiom;
  #define UI_USER_INTERFACE_IDIOM() (([[UIDevice currentDevice].model rangeOfString:@"iPad"].location != NSNotFound) ? UIUserInterfaceIdiomPad : UIUserInterfaceIdiomPhone)
#endif // ifndef __IPHONE_3_2 

コメント欄で。

于 2010-04-28T03:58:28.560 に答える
0

フレームを弱いリンクにするもう 1 つの方法は、ターゲットで「Get Info」を実行し、[General] タブの下にフレームワークのリストが表示されることです。UIKit のタイプを Weak に変更します。

実行時にiPhoneで「シンボルが見つかりません:_UIScreenDidConnectNotification」という問題が発生しました。

于 2010-06-10T02:46:03.960 に答える