Ios 在没有界面生成器的情况下制作通用应用程序
我使用的是XCode 4.2和iOS 5,我想制作一个通用的应用程序,而不是使用Interface Builder,如本文所述 我还想使用Kotan代码中概述的技术分离我的iPhone和iPad代码 因此,我有了从它继承的主Ios 在没有界面生成器的情况下制作通用应用程序,ios,xcode4,interface-builder,ios5,universal,Ios,Xcode4,Interface Builder,Ios5,Universal,我使用的是XCode 4.2和iOS 5,我想制作一个通用的应用程序,而不是使用Interface Builder,如本文所述 我还想使用Kotan代码中概述的技术分离我的iPhone和iPad代码 因此,我有了从它继承的主appdelegate、iPhone和appdelegate\u iPad 回到XCode 4.0(以及Kotan的帖子),使用了适当的appdelegate,因为有一个与之关联的MainWindow\u iPhone.xib(或MainWindow\u iPad.xib)。
appdelegate
、iPhone和appdelegate\u iPad
回到XCode 4.0(以及Kotan的帖子),使用了适当的appdelegate,因为有一个与之关联的MainWindow\u iPhone.xib
(或MainWindow\u iPad.xib
)。如果我没有使用.xibs,如何通过编程转到正确的appdelegate
(我希望解决方案不涉及
如果(UI\u USER\u INTERFACE\u 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>);
如果以编程方式进行,则必须在需要的地方进行
很可能,应用程序委托是应用程序的一部分,不依赖于设备,因此您不需要严格地为iphone和ipad分别实例化一个。我所指的是,如果您不提供nib,您应该指定一个委托,它只是为您的应用程序定义了一个高级入口点
在你的–应用程序:didfishlaunchingwithoptions:
(应用程序入口点)中,你应该创建你的UI,即创建一组你将在nib中定义的对象(控制器、视图等;nib只是一种视觉上“创建”的机制和连接对象;如果不以可视化方式进行,则以编程方式进行)并连接它们;现在,其中一些对象确实依赖于设备(即视图),而其他对象则不依赖于设备。对于前者,您可以通过使用UI\u USER\u INTERFACE\u习惯用法
检查来决定从哪个类实例化它们
或者,您可以有两个不同的委托类,一个创建iphone UI,另一个创建ipad UI;这也是一个完全合理的方法。这基本上取决于你的应用程序的复杂性和你愿意接受的权衡
这或多或少是我对事情的看法,为可能的迂腐道歉,但我希望我能说清楚
如果你的应用程序中有很多
If
s,你也可以定义一个“decorator”函数(例如:decoratedClassName fromGenericClassName:(NSString*)
,不要管它的冗长)来隐藏在它里面UI\u用户界面\u习惯用法
或者将来可能出现的任何其他“装饰”需要…1)如果有.xibs,我不需要指定UI\u用户界面\u习惯用法
(根据上面链接的Kotan帖子)。我必须在NIB和该if
语句之间进行选择吗?2) 您是否建议我使用if
语句跟踪main.m
中的设备?这是真的,它确实在那里起作用。注意XCode 4.2中的更改:返回UIApplicationMain(argc、argv、nil、NSStringFromClass([AppDelegate class])代码>不迂腐!这是一个关于如何在为通用应用程序编程时更加优雅的有趣话题。我喜欢你的解决方案:一个应用程序委托,它创建它所需的所有控制器和视图。有些可能是特定于设备的,有些则不是。尽量少用UI\u用户界面\u惯用语if语句。谢谢
return UIApplicationMain(argc, argv, nil,
NSStringFromClass([AppDelegate class]));