如何加载固件相关的NIBS?

时间:2010-10-24 10:19:25

标签: iphone uiviewcontroller firmware

这是我的问题:

我在iOS 3.0上有一个运行顺畅的应用程序 我已经工作很长时间将它移植到4.0并包含新功能。

我使用Interface Builder添加了iAd。

我知道我必须以编程方式定义它仍然支持3.0设备。 我弱了链接框架。但是加载NIB时应用程序崩溃了。

根据固件版本,有没有办法加载NIB? 假设我有FirstView.xib和FirstView3X.xib

如何根据固件选择加载哪一个?

谢谢

PS:这是我在StackOverflow上的第一个问题!

2 个答案:

答案 0 :(得分:1)

祝贺你的第一个问题:-)如何加载笔尖?将接口拆分为多个文件是个好主意。我通常为每个控制器使用一个单独的笔尖,并使用initWithNibName:bundle:初始化程序加载它们。由于您在此处提供了笔尖名称,因此您可以轻松自定义加载行为。

如果使用标签栏控制器加载笔尖,则可能在一个笔尖中包含所有标签。我想我会将标签分成单独的笔尖并以编程方式加载它们:

id tab1 = [[UIViewController alloc] initWithNibName:@"Tab1" bundle:nil];
id tab2 = [[UIViewController alloc] initWithNibName:@"Tab2" bundle:nil];
id tab3 = [[UIViewController alloc] initWithNibName:@"Tab3" bundle:nil];
[tabBarController setViewControllers:[NSArray arrayWithObjects:
    tab1, tab2, tab3, nil]];

由于您现在可以控制笔尖名称,因此您可以轻松检测固件版本并加载正确的笔尖:

id tab1 = [[UIViewController alloc] initWithNibName:
    [self nibNameForCurrentFirmware] bundle:nil];

至于固件版本检测本身,我认为您可以使用[UIDevice systemVersion]

答案 1 :(得分:1)

您可以从UIDevice对象中提取当前版本:

NSString *osVersion = [[UIDevice currentDevice]systemVersion];
NSArray *ver = [osVersion componentsSeparatedByString:@"."];

如果您对比较单个值的字符串感到满意(例如[[ver objectAtIndex:0] isEqualToString:@"3"])。您可能希望将版本号转换为整数,以便比较范围(例如osMajor >= 4)。

您还可以检查某些类是否存在,并根据以下内容加载相应的NIB:

if (NSClassFromString(@"MKMapView") != nil) {
    /* Do map stuff... */
}