0

異なるターゲット (iPhone/iPad) に対して AppDelegate.h を分離することは可能ですか?

デフォルトの共通の main.m があります。

#import <UIKit/UIKit.h>

#import "AppDelegate.h"

int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

各 iPhone/iPad フォルダー内の各ターゲットに対して appdelegate.h/.m を使用して、2 つのターゲットを正しくセットアップしています。

Duplicate interface definitionそれらのヘッダー ファイルは類似しており、iPhone ターゲットをビルドすると、iPad appdelegate.h から不平を言っています。ただし、逆は問題なくビルドできます。

どうすればこれを修正できますか?

4

3 に答える 3

3

各ターゲットの「ビルド フェーズ」に進み、各ターゲットの「コンパイル ソース」の下に適切なアプリ デリゲートが含まれていることを確認してください。main.mこれら 2 つのアプリ デリゲートに異なるクラスを指定する場合は、適切なクラスを使用するように変更することもできます。

#import <UIKit/UIKit.h>

#import "IphoneAppDelegate.h"
#import "IpadAppDelegate.h"

int main(int argc, char * argv[])
{
    @autoreleasepool {
        if (NSClassFromString(@"IphoneAppDelegate"))
            return UIApplicationMain(argc, argv, nil, @"IphoneAppDelegate");
        else
            return UIApplicationMain(argc, argv, nil, @"IpadAppDelegate");
    }
}

個人的には、アプリのデリゲートを 1 つにして、iPhone/iPad の条件付きチェックを配置することを好みます。

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
     // do iPad specific stuff
}

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
     // do iPhone specific stuff
}

扱いにくそうに見えますが、アプリ デリゲートの多くは 2 つのプラットフォームで同じであり、2 つのアプリ デリゲートを持つコード メンテナンスの問題が発生します。

于 2013-10-25T16:09:52.983 に答える
0

1 つの方法は、ターゲットのビルド設定に「プリプロセッサ マクロ」を追加することです。たとえば、iPhone ターゲットでは「BUILD_FOR_IPHONE=1」、iPad では「BUILD_FOR_IPHONE=0」と入力します。次に、iPhone の AppDelegate.h に次を追加できます。

#if BUILD_FOR_IPHONE
<your normal .h contents>
#endif

そしてあなたのiPadで

#if !BUILD_FOR_IPHONE
....
#endif
于 2013-10-25T16:10:34.487 に答える