无需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文件的条目,否则如果你从项目中删除x​​ib文件,你的程序将崩溃。

编辑:我意识到迟到,你也问如何从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或其他任何需要的装饰未来…