21

XCodeのウィザードのようなものを使用してiPhoneアプリケーションをユニバーサルアプリに変換しました。

それはうまく構築されますが、明らかにいくつかの領域で少しゴミに見えます:)

使用しているデバイスに応じてペン先をロードする必要があります。ペン先の読み込みとは何の関係もないinitWithNibいくつかのデータ()を使用してコントローラーを作成するコードがすでにあるため、を使用してビューコントローラーを作成したくありません。initWithMyLovelyData

私はあなたが使用しているデバイスを見つけることを知っているので、それらが何らかの形で内部的に呼び出されると仮定して、実際のViewController自体の内部UI_USER_INTERFACE_IDIOM()をオーバーライドしてみました。initWithNibNameしかし、構文がわからないと思うので、機能していません。

私が試してみました

if(ipad..) self = [super initWithNibName:@"MyIpadNib" bundle:nibBundleOrNil];

そしてそれはうまくいきません:/

編集-私はこれを大規模に編集したことを知っています、いくつかの調査を行った後、私の質問をもう少し具体的にしました-お詫びします!

4

5 に答える 5

77

実際、Appleはこれをすべて自動的に行い、NIBファイルに名前を付けるだけです。

MyViewController~iphone.xib // iPhone
MyViewController~ipad.xib // iPad

最小限のコードでViewControllerをロードします。

[[MyViewController alloc] initWithNibName:nil bundle:nil]; // Apple will take care of everything
于 2012-03-07T15:04:18.340 に答える
22

編集:以下の@Adamの答えは正解です。

ロードするペン先を決定するには、次の手順を実行し、initWithMyLovelyDataメソッドを破棄し、プロパティを使用してデータを設定します。すべてのinitコードをプロパティセッターメソッドに簡単に移動できるはずです。

MyViewController *viewController;

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
    viewController = [[MyViewController alloc] initWithNibName:@"ipadNIB" bundle:nil];
} else {
    viewController = [[MyViewController alloc] initWithNibName:@"iphoneNIB" bundle:nil];
}

viewController.myLovelyData = someData;
于 2010-06-16T11:02:17.730 に答える
2

これらの2つのメソッドをIPadHelperというクラスに配置し、addIPadSuffixWhenOnIPadメソッドを使用して、プラットフォームに応じて2つのペン先を条件付きで選択します。

+ (BOOL)isIPad{
    if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iPhoneOS_3_2){
        if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad){
            return YES;
        }
    }
    return NO;
}

+ (NSString *)addIPadSuffixWhenOnIPad:(NSString *)resourceName{
    if([IPadHelper isIPad]){
        return [resourceName stringByAppendingString:@"-iPad"];
    }
    else {
        return resourceName;
    }   
}

最初の方法の詳細については、ここh ttp://cocoawithlove.com/2010/07/tips-tricks-for-conditional-ios3-ios32.htmlを参照してください...

于 2010-10-04T09:22:06.740 に答える
2

あなたはあなたのケーキを持ってそれを食べることもできます。initWithNibName:bundle:をラップするメソッドを追加し、myLovelyDataパラメーターを追加するだけです。

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil  myLovelyData:(id)data
{
    if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) 
    {
        // Custom initialization using myLovelyData
        //
    }
    return self;
}
于 2010-10-09T07:57:06.620 に答える
0

Cファイルを作成したほうがいいと思います。
FileHelper.h

#import <Foundation/Foundation.h>
BOOL isIPad();
NSString *addIPadSuffixWhenOnIPad(NSString *resourceName);

FileHelper.m

#import "FileHelper.h"
BOOL isIPad() {
    if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iPhoneOS_3_2) {
        if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
            return YES;
        }
    }
    return NO;
}

NSString *addIPadSuffixWhenOnIPad(NSString *resourceName) {
    if(isIPad()) {
        return [resourceName stringByAppendingString:@"-iPad"];
    }
    else {
        return resourceName;
    }   
}
于 2012-01-17T22:13:42.073 に答える