2011-04-08 144 views
3

所以我正在編寫一個應用程序,我希望它是通用的。當我創建項目時,我創建了一個通用應用程序。我寫了所有的iPhone代碼,並擁有10個課程。現在我想創建iPad版本。我不希望基於完全相同的代碼擁有兩組類,而是希望根據設備類型加載不同的Nib。不同設備的不同筆尖

我嘗試在應用程序委託中使用BOOL並且遇到了麻煩。我嘗試了mainViewController類中的設備檢查(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil我根據設備類型返回了不同的筆尖。但我只能得到iphone版本或空白的筆尖。預先感謝您的幫助。

回答

0

我想出如何:

在Interface Builder

,使用文件 - >創建iPad版

然後保存文件,並將其添加到項目中。然後在alloc時,初始化每個viewController,檢查是否爲UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad,否則它是一個iPhone或iPod Touch。在初始保存後,我無法對其進行編輯,但它起作用。

0

我有這個問題,我通過自定義UIViewController的方法來解決它。

- (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,但基本的概念是使用視網膜的「@ 2x」政策,但我們使用「@HD」。

+0

看起來很酷,但當iPad 3或4具有視網膜顯示,然後你被@ HD @ 2x卡住時會發生什麼。這會是一團糟。 – Moshe 2011-04-11 00:28:35

1

Apple現在爲您提供了一個默認機制,以便在同一個項目中分離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]; 
} 

這給你一個起點,在那裏你可以根據設備的用戶是對改變程序流程。例如通過實例化主視圖控制器的其中一個子類(如下所述)。

當您將新的視圖控制器添加到您的項目中時,您應該通過創建一個通用控制器超類以及iPhone/iPad特定的子類繼續此範例。請注意,通用超類不應該有與它們相關聯的nib文件,而子類應該各自擁有自己的獨立筆尖。

這樣你就可以在三個類之間分解代碼,在超類中保留與平臺無關的東西 - 例如一些屬性,方法,IBOutlets和IBActions - 並將特定於平臺的實現放入子類中。

+0

escept,我正在使用xcode 3 – Andrew 2011-04-10 23:42:28

+0

任何原因你不轉換?它是免費的.. [developer.apple.com/xcode](http://developer.apple.com/xcode/) – 2011-04-11 23:11:01

+0

是Xcode 4公開發布還是在測試版?我看到它處於測試階段,看着所有主要的變化,只是認爲我會堅持我失敗的事情。我不經常查看dev.apple.com – Andrew 2011-04-11 23:19:32

6

根據文檔(資源編程指南),您可以使用以下名稱約定: myNibName〜ipad.xib和myNibName〜iphone.xib因此每個文件只能在受支持的設備上打開。你甚至不需要設置不同的appDelegates :)

--- from doc --- 在iOS 4.0和更高版本中,可以將單個資源文件標記爲僅在特定類型的設備上可用。此功能簡化了您必須爲通用應用程序編寫的代碼。而不是創建單獨的代碼路徑來爲iPhone加載一個版本的資源文件,併爲iPad加載不同版本的文件,您可以讓包加載例程選擇正確的文件。你所要做的就是適當地命名你的資源文件。

要將資源文件與特定設備相關聯,請將自定義修飾符字符串添加到其文件名。包含此修飾符字符串將生成以下格式的文件名:

該字符串表示資源文件的原始名稱。它也代表從代碼訪問文件時使用的名稱。同樣,該字符串是用於標識文件類型的標準文件擴展名。該字符串是區分大小寫的字符串,可以是以下值之一:

〜ipad - 資源只能在iPad設備上加載。 〜iphone - 資源只能在iPhone或iPod touch設備上加載。

+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 – 2012-03-20 10:57:37

+3

小寫' p'非常重要。 〜iPad將工作模擬器,但不會加載在真實的設備上。某些版本的XCode會創建〜iPad文件(帶有大寫字母「P」),這些文件具有誤導性並且不起作用。 – 2012-03-26 20:51:57

+0

^^感謝Johan和Woj。我對自己很好奇。 – Cyprus106 2014-04-30 02:34:40