XCodeのウィザードのようなものを使用してiPhoneアプリケーションをユニバーサルアプリに変換しました。
それはうまく構築されますが、明らかにいくつかの領域で少しごみに見えます:)
使用しているデバイスに応じてペン先をロードする必要があります。 initWithNib
を使用してビューコントローラーを作成したくありません。ペン先の読み込みとは関係のないデータ(initWithMyLovelyData
)を使用してコントローラーを作成するコードがすでにあるからです。
UI_USER_INTERFACE_IDIOM()
を使用しているデバイスを見つけることがわかっているので、実際のViewController自体の中でinitWithNibName
をオーバーライドしてみました。ただし、何らかの方法で内部的に呼び出されると想定しています。しかし、構文がわからないと思うので、機能していません。
私が試してみました
if(ipad..) self = [super initWithNibName:@"MyIpadNib" bundle:nibBundleOrNil];
そしてそれは機能しません:/
編集-私はこれを大規模に編集したことを知っています、いくつかの調査を行った後、私の質問をもう少し具体的にしました-謝罪!
編集:以下の@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;
実際、Appleはこれをすべて自動的に行い、NIBファイルに名前を付けるだけです。
MyViewController~iphone.xib // iPhone
MyViewController~ipad.xib // iPad
最小限のコードでViewControllerをロードします。
[[MyViewController alloc] initWithNibName:nil bundle:nil]; // Apple will take care of everything
これらの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 を参照してください...
あなたはあなたのケーキを持ってそれを食べることもできます。 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;
}
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;
}
}