看一看你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文件的條目,否則如果你從項目中刪除xib文件,你的程序會崩潰。
編輯:我意識到遲到,你也問如何區分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
或任何其他「裝修」需要在未來可能出現的...
** 1)**如果有.xibs,我不需要指定'UI_USER_INTERFACE_IDIOM'(按照上面鏈接的Kotan的帖子)。我必須在nibs和這個if語句之間進行選擇嗎? ** 2)**你是否建議我在'main.m'中放置'if'語句來跟蹤設備?這是事實,它在那裏工作。注意XCode 4.2中的變化:'返回UIApplicationMain(argc,argv,nil,NSStringFromClass([AppDelegate class]));' – coco
不迂腐!在編寫通用應用程序時,如何更優雅,這是一個有趣的話題。我喜歡你的解決方案:單一的應用程序委託,它創建了它所需要的所有控制器和視圖。有些可能是設備特定的,有些則不是。最少使用'UI_USER_INTERFACE_IDIOM' if語句。謝謝! – coco