2011-11-25 80 views
4

我正在使用iOS 5的XCode 4.2,並且希望使用界面生成器製作通用應用程序而不是,如本文中概述的not using a MainWindow.xib所述。在沒有界面生成器的情況下製作通用應用程序

我還想使用Kotan Code的post中概述的技術來分開我的iPhone和iPad代碼。

所以我有主要appdelegate,appdelegate_iPhoneappdelegate_iPad從它繼承。

回到XCode 4.0(在Kotan的帖子中),使用了合適的appdelegate,因爲有一個MainWindow_iPhone.xib(或MainWindow_iPad.xib)與它關聯。如果我沒有使用.xibs,我如何以編程方式去正確的appdelegate?

(我希望該解決方案不涉及if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {}等)

回答

3

看一看你main.c文件,它應該包含如下語句:

int retVal = UIApplicationMain(argc, argv, nil, nil); 

其中UIApplicationMain被定義爲:

int UIApplicationMain (
    int argc, 
    char *argv[], 
    NSString *principalClassName, 
    NSString *delegateClassName 
); 

所以,你只需執行:

int retVal = UIApplicationMain(argc, argv, nil, <YOUR_DELEGATE_CLASS_NAME>); 

你的程序將使用該委託類而不是在nib中定義的類。

也可以考慮編輯info.plist文件,在那裏你應該刪除所有關於你在那裏找到的主要nib文件的條目,否則如果你從項目中刪除x​​ib文件,你的程序會崩潰。

編輯:我意識到遲到,你也問如何區分iPad從iPhone ...並希望這不涉及檢查,如果UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad

AFAIK,UI_USER_INTERFACE_IDIOM是正式的做法。事實上,如果您檢查該宏的定義,您將看到它基於類,該類返回有關您運行程序的設備的信息。所以,我看不出有什麼不好。

另一種方法可能是使用本身,或UIDevice-Extension,這是一個延伸的框架。


編輯2:

爲了您在評論中問的問題:

1)如果有.xibs,我並不需要指定UI_USER_INTERFACE_IDIOM (按Kotan的帖子鏈接在上面)。我必須在筆尖和 這個if聲明之間進行選擇嗎?

我這麼認爲;無論是在xib級別還是以編程方式執行。

2)你是在暗示我把if語句來跟蹤設備 main.m?這是事實,它在那裏工作。注意的XCode 4.2的變化:

return UIApplicationMain(argc, argv, nil, 
         NSStringFromClass([AppDelegate class])); 

如果你這樣做編程,你必須在你需要它這樣做。

很有可能,應用程序委託是不依賴於設備的應用程序的一部分,所以您不會嚴格需要爲iphone和iPad實例化一個。我指的是,如果你不提供一個筆尖,你應該指定一個委託,它只是爲你的應用定義一個高級入口點。

在您的– application:didFinishLaunchingWithOptions:(應用程序入口點),您應該創建您的UI,即創建您將在其他位置定義的一組對象(控制器,視圖,任何;一個筆尖只是一種可視化「創建」並連接對象;如果你不直觀地做它,你可以編程)並連接它們;現在,這些對象中的一些確實依賴於設備(即視圖),而其他則不是。對於前者,您可以通過使用UI_USER_INTERFACE_IDIOM檢查來決定從哪個類實例化它們。

或者,您可以有兩個不同的委託類,一個創建iphone UI,另一個創建ipad UI;這也是一個完全合理的方法。它基本上取決於您的應用程序的複雜程度以及您願意接受哪些權衡。


這或多或少是我看到的東西,可能是迂腐的道歉,但我希望我能說清楚。

如果您對您的應用程序許多if S,你也可以定義一個「裝飾」功能(如:decoratedClassNameFromGenericClassName:(NSString*),不去管冗長)隱藏在它UI_USER_INTERFACE_IDIOM或任何其他「裝修」需要在未來可能出現的...

+0

** 1)**如果有.xibs,我不需要指定'UI_USER_INTERFACE_IDIOM'(按照上面鏈接的Kotan的帖子)。我必須在nibs和這個if語句之間進行選擇嗎? ** 2)**你是否建議我在'main.m'中放置'if'語句來跟蹤設備?這是事實,它在那裏工作。注意XCode 4.2中的變化:'返回UIApplicationMain(argc,argv,nil,NSStringFromClass([AppDelegate class]));' – coco

+0

不迂腐!在編寫通用應用程序時,如何更優雅,這是一個有趣的話題。我喜歡你的解決方案:單一的應用程序委託,它創建了它所需要的所有控制器和視圖。有些可能是設備特定的,有些則不是。最少使用'UI_USER_INTERFACE_IDIOM' if語句。謝謝! – coco

相關問題