2011-04-08 12 views
3

私はアプリを書いているので、普遍的なものにしたい。プロジェクトを作成したとき、普遍的なアプリケーションを作成しました。私はすべてのiPhoneのコードを書いて、10のクラスのようにしている。今、私はiPad版を作りたいと思っています。基本的に全く同じコードを持つ2組のクラスを用意するのではなく、デバイスタイプに基づいて別のNibをロードしたいと思います。さまざまなデバイスの異なるペン先

アプリデリゲートでBOOLを使用しようとしましたが、問題がありました。私はmainViewControllerクラスのデバイスチェックを試みました(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil私はデバイスタイプに基づいてdifferntペン先を返しました。しかし、私はiPhoneのバージョンまたはブランクペンだけを得ることができます。助けを前にありがとう。

答えて

0

私は方法を考え出しました。次に、alloc、各viewControllerを起動し、UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPadかどうかをチェックし、それ以外の場合はiPhoneまたはiPod Touchをチェックします。最初の保存後に編集するのに問題がありましたが、機能します。

0

私はこの問題を抱えており、UIViewControllerのinitWithNibName:bundle:メソッドをカスタマイズして解決しました。

- (id) initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle*)nibBundleOrNil 
{ 
    // See below for definition of "LWEUniversalAppHelpers fileNamed:" 
    NSString *universalNibName = [LWEUniversalAppHelpers fileNamed:nibNameOrNil]; 
    if ((self = [super initWithNibName:universalNibName bundle:nibBundleOrNil])) 
    { 
    // Custom initialization 
    } 
    return self; 
} 

LWEUniversalAppHelpers私の会社は、デバイスがiPadであるかどうかを決定するために書かれたヘルパークラスです。それはpublic on GitHubですが、基本的な考え方はRetinaの "@ 2x"ポリシーを使用することですが、代わりに "@HD"を使用します。

+0

は涼しいですが、iPad 3または4に網膜が表示されていて、@ HD @ 2xがついているとどうなりますか?それは混乱するだろう。 – Moshe

1

アップルでは、​​同じプロジェクトでiPhoneとiPad間でコードを区切るためのデフォルトのメカニズムを提供します。

Xcode 4では、新しい「ウィンドウベースのアプリケーション」または「ビューベースのアプリケーション」を作成するときに、「デバイスファミリ」を選択するオプションが表示されます。このオプションに "Universal"を選択すると、Xcodeは3つのアプリケーションデリゲートを作成します。

まず、メインアプリデリゲート:

YourAppNameAppDelegate : NSObject <UIApplicationDelegate> 

と「YourAppNameAppDelegate」のサブクラスです(別のグループに配置された)二つの他のアプリを委任:

YourAppNameAppDelegate_iPhone : YourAppNameAppDelegate 
YourAppNameAppDelegate_iPad : YourAppNameAppDelegate 

あなたとあなたのアプリを実行しますiPhoneまたはiPadシミュレータ(またはデバイス)のいずれかを選択すると、アプリケーションは選択したデバイスに基づいて自動的に_iPhoneまたは_iPadのアプリケーションデリゲートサブクラスを使用します。

アプリケーションをオーバーライドする場合:didFinishLaunchingWithOptions:各サブクラスのメソッドは、この作業が表示されます。

// In YourAppNameAppDelegate_iPhone.m 
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    NSLog(@"iPhone App Delegate"); 
    return [super application:application didFinishLaunchingWithOptions:launchOptions]; 
} 

// In YourAppNameAppDelegate_iPad.m 
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    NSLog(@"iPad App Delegate"); 
    return [super application:application didFinishLaunchingWithOptions:launchOptions]; 
} 

これは、あなたが、ユーザーがオンになっているデバイスに基づいてプログラムの流れを変えることができます出発点を与えます。たとえば、メインビューコントローラのサブクラスの1つをインスタンス化する(後述のように)。

新しいビューコントローラをプロジェクトに追加するときには、1つの汎用コントローラスーパークラスとiPhone/iPad固有のサブクラスを作成してこのパラダイムを続行する必要があります。一般的なスーパークラスにはnibファイルが関連付けられてはいけませんが、サブクラスはそれぞれ独自のnibが必要です。

このようにして、3つのクラス間でコードを壊すことができます。例えば、いくつかのプロパティ、メソッド、IBOutlets、IBActionsなど、プラットフォームに依存しないスーパークラスを維持し、プラットフォーム固有の実装をどちらかのサブクラスに配置します。

+0

escept、私はxcode 3を使用しています – Andrew

+0

スイッチを作っていない理由はありますか?それは無料です.. [developer.apple.com/xcode](http://developer.apple.com/xcode/) –

+0

はxcode 4が公開されていますか、ベータ版ですか?私はベータ版で、大きな変更をすべて見て、私が失敗したことに固執すると思った。私はdev.apple.comを頻繁にチェックしていません – Andrew

6

ドキュメンテーション(リソースプログラミングガイド)によると、 myNibName〜ipad.xibとmyNibName〜iphone.xibという名前の規約を使用すると、各ファイルはサポートされているデバイスでのみ開くことができます。あなたも、それだけで、デバイスの特定のタイプで使用できるように、個々のリソースファイルをマークすることが可能で、iOS 4.0以降では ---ドキュメントから---

:)異なるappDelegatesを設定する必要がありません。この機能により、Universalアプリケーション用に記述しなければならないコードが簡単になります。別のコードパスを作成して、iPhone用のリソースファイルとiPad用の別のバージョンのファイルをロードするのではなく、バンドルロードルーチンで正しいファイルを選択させることができます。リソースファイルの名前を適切に指定するだけです。

リソースファイルを特定のデバイスに関連付けるには、ファイル名にカスタム修飾子文字列を追加します。この修飾子文字列を含めると、次の形式のファイル名が生成されます。

文字列は、リソースファイルの元の名前を表します。また、コードからファイルにアクセスするときに使用する名前も表します。同様に、文字列は、ファイルのタイプを識別するために使用される標準のファイル名拡張子です。文字列は大文字と小文字を区別する文字列で、次の値のいずれかになります。

〜ipad - リソースはiPadデバイスにのみ読み込まれます。 〜iphone - リソースはiPhoneまたはiPod touchデバイスにのみロードする必要があります。

Interface Builderで

、> [ファイル]を使用してファイルを保存iPadのバージョン

を作成し、プロジェクトに追加します:

+1

'〜ipad'と '〜iphone'の小文字の 'p'は間違っていると感じましたが、それはAppleが何を記述しているかです。ドキュメントへのリンク:https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/LoadingResources/Introduction/Introduction.html%23//apple_ref/doc/uid/10000051i-CH1-SW2 –

+3

小文字の ' pは非常に重要です。 〜iPadはエミュレータで動作しますが、実際のデバイスにはロードされません。 XCodeのいくつかのバージョンでは、〜のiPadファイル(大文字の「P」)が作成され、誤解を招く恐れがあり、動作しません。 –

+0

^^ JohanとWojに感謝します。私はそれ自体が好奇心だった。 – Cyprus106

関連する問題