无需Interface Builder即可制作通用应用
我在iOS 5中使用XCode 4.2,并且想要制作一个通用应用程序, 而不是使用Interface Builder,如本文所述, 不使用MainWindow.xib 。
我还想使用Kotan Code的post中概述的技术来分离我的iPhone和iPad代码。
所以我有主appdelegate
,和appdelegate_iPhone
和从它inheritance的appdelegate_iPad
。
回到XCode 4.0(和Kotan的文章),使用了相应的appdelegate,因为有一个MainWindow_iPhone.xib
(或MainWindow_iPad.xib
)与它关联。 如果我没有使用.xibs,我该如何编程去正确的appdelegate?
(我希望解决scheme不涉及if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {}
等)
看看你的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文件,在那里你应该删除所有关于你在那里find的主要的nib文件的条目,否则如果你从项目中删除xib文件,你的程序将崩溃。
编辑:我意识到迟到,你也问如何从iPhone区分一个iPad …并希望这不涉及检查UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad
。
AFAIK, UI_USER_INTERFACE_IDIOM
是官方的做法。 事实上,如果您检查该macros的定义,您将会看到它是基于一个UIDevice
类,它返回有关您运行程序的设备的信息。 所以我没有看到有什么不好的地方
另一种方法可能是使用UIDevice
本身,或UIDevice-Extension ,这是一个扩展UIDevice
的框架。
编辑2:
对于你在评论中提出的问题:
1)如果有.xibs,我不需要指定
UI_USER_INTERFACE_IDIOM
(按照上面链接的Kotan的post)。 我必须在笔尖之间进行select吗?
我想是这样; 要么在xib级别执行,要么以编程方式执行。
2)你是否build议我把
if
语句跟踪main.m
的设备? 这是事实,它在那里工作。 注意XCode 4.2中的变化:
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
如果你以编程的方式来做,你必须在需要的地方做。
可能,应用程序委托是应用程序的一部分,不依赖于设备,所以你不会严格需要实例化一个iPhone和一个不同的iPad。 我指的是,如果你不提供一个笔尖,你应该指定一个委托,它只是为你的应用程序定义一个高级的入口点。
在你的– application:didFinishLaunchingWithOptions:
应用程序入口点),你应该创build你的UI,那就是创build一个你将在nib中定义的对象集合(controllers,views,whatever; nib只是一个可视化的机制“创build”和连接对象;如果你不做任何直观的事情,你可以通过编程的方式)并连接它们; 现在,这些对象中的一些确实依赖于设备(即视图),而其他的则不是。 对于前者,可以通过使用UI_USER_INTERFACE_IDIOM
检查来决定从哪个类实例化它们。
或者,您可以有两个不同的委托类,一个创buildiPhone UI,另一个创buildipad UI; 这也是一个完全合理的方法。 这基本上取决于您的应用程序的复杂性,以及您愿意接受的折衷。
这或多或less是我看到的事情,道歉可能是迂腐的,但我希望我能说清楚。
如果你的应用程序有很多UI_USER_INTERFACE_IDIOM
,你也可以定义一个“decorator”函数(例如: decoratedClassNameFromGenericClassName:(NSString*)
, UI_USER_INTERFACE_IDIOM
介意它的详细程度)来隐藏UI_USER_INTERFACE_IDIOM
或其他任何需要的装饰未来…