Ios 在没有界面生成器的情况下制作通用应用程序

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)。

我使用的是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
)。如果我没有使用.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]));