0

私は、iPad バージョンの UIPopoverController を使用するユニバーサル アプリに取り組んでいます。(ベース SDK とデプロイ ターゲットの両方が iOS 4.3 です)

iPhone シミュレーター (バージョン 4.3) を使用して iPad と iPhone の条件付きコード パスをテストすると、弱いリンクもNSClassFromString(@"UIPopoverController")アプローチも期待どおりの動作をしません。

UIKit フレームワークの弱いリンクをテストするときは、必ず LLVM 2.1 コンパイラを使用し、UIKit フレームワークを [ターゲット] -> [ビルド フェーズ] -> [バイナリをライブラリにリンク] で [オプション] にします。(私が理解しているように、Xcode 4.1でそれを行う方法です)。

コードの実行

if ([UIPopoverController class]) { 
...
_popover = [[UIPopoverController alloc] initWithContentViewController:controller];
...
}

iPhone シミュレーターでアプリケーションがクラッシュし、[UIPopoverController class]が返されないことが示されますnil。上記に置き換える[UIPopoverController class]NSClassFromString(@"UIPopoverController")、同じクラッシュが発生します。

シミュレーターで実行しているときにこれらの条件付きチェックを機能させる方法を知っている人はいますか?

4

2 に答える 2

0

UIPopoverController クラスは、バージョン 3.2 以降の iOS の一部として存在するため、iOS バージョン 4.x を搭載したデバイスでは nil を返すべきではありません。iOS 3.1.3 以下の iPhone のみが弱い (オプションの) リンクで nil を取得します。このクラスを使用できるかどうかを判断するには、上記の提案されたソリューションを userInterfaceIdiom で試してください。

于 2011-10-06T20:39:03.883 に答える
-2

コードが iPad で実行されているかどうかを判断してみてください。
これなら安心して使えますねUIPopoverController

- (BOOL)isPad
{
    if ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)])
    {
        return ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad);
    }
    else
    {
        return NO; // all iPad OS's implement -userInterfaceIdiom
    }
}
于 2011-09-18T10:13:34.970 に答える