2012-09-18 35 views
0

我的應用程序作爲僅iPad應用程序開始生活。現在我將它轉換成適合iPhone的較小版本。我使用的是相同的代碼庫,而且許多控制器實際上並不需要做太多改變 - 只需要重新制作視圖以適應較小的屏幕即可。這不是一款通用的應用程序,因爲iPad和iPhone版本的一些功能不同,而App Store中的價格差別很大。在iPhone上運行時,非通用iPhone應用程序自動加載iPad筆尖

我已經將設備系列設置爲iPhone的單獨目標。最初的目標是將這一套設置爲iPad。

我重拍了一大堆筆跡,其格式爲view~iphone.xib,當我在iPhone上運行iPhone時,這些文件被正確加載,而不是原來的iPad文件(格式爲view.xib)。

問題是當我在iPad上運行iPhone的iPhone。正如你對iPhone應用程序的期望,它運行在那個小小的iPhone窗口(可以翻倍到2倍)。但是加載的筆尖是iPad筆尖,顯然不適合iPhone尺寸的顯示屏。我不明白爲什麼iOS不會自動加載iPhone版本。如果我測試UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad,它會返回false,所以它知道它正在iPhone模式下運行!

鑑於我無法阻止客戶在iPad上運行iPhone應用程序,我想使其正常工作。我已經嘗試了一些東西,但他們似乎並不正確:

  • 代碼更改爲[[MyViewController alloc] initWithNibName:@"MyView~iphone" bundle:nil];將加載正確的筆尖,但是這意味着我將不得不把條件代碼周圍所有的位置,其中一個筆尖名是指定的 - 這是一個很大的應用程序,所以有很多,而且當我或其他開發人員忘記在新代碼中執行此操作時,將來可能會出現錯誤。
  • 將所有~iphone筆尖重命名爲與iPad版本具有相同的文件名(例如view.xib),將它們移動到單獨的目錄中(以便它們不會與原件名稱相沖突)並將它們重新添加回該項目只包含在iPhone目標中(而不包括在iPad目標中),並且從iPhone目標(但仍包含在iPad目標中)中取消原始iPad筆尖會導致正確的筆尖在運行時加載(因爲「不管命名如何,錯誤的「nib不再處於每個版本的捆綁包中」)。請注意,如果我將文件名保留爲view~iphone.xib,那麼當iPhone版本在iPad上運行時,嘗試加載該筆尖時出現異常:Could not load NIB in bundle。相同的文件名使得這種方法非常不愉快,乍看之下並不明顯。
  • 將原始xib重命名爲view~ipad.xib(iPhone的筆尖爲view~iphone.xib)仍然會導致iPad筆尖在iPad上運行iPhone版本時加載。

必須有比這兩種方法更好的方法嗎?爲什麼當設備清楚地知道它正在運行iPhone應用程序時加載了錯誤的(iPad)筆尖?

回答

0

你應該從iPhone的目標刪除MyView~iPad(點擊筆尖文件,然後在右側面板中下Target Membership部分取消選中的文件。

而且取消iPhone坯iPad的目標,這將排除碎粒,所以他們不會複製到app包。您可以使用相同的資源方法來降低應用程序大小。

+0

感謝您的快速回答 - 我編輯了我的問題,注意到在我提到的第二種方法中,如果我將文件名保留爲'view〜iphone.xib',那麼在運行時會出現異常。所以我不能僅僅從一些版本中排除一些文件 - 文件名必須缺少'〜iphone'或者iPad不會加載它(我懷疑它正在尋找'〜ipad',然後回落到'view'。 xib'。 –

相關問題