这是我的问题:
我有一个在 iOS 3.0 上运行流畅的应用程序我一直在努力将它移植到 4.0 并包含新功能。
我使用 Interface Builder 添加了 iAd。
我知道我必须以编程方式定义它以仍然支持 3.0 设备。我弱链接了框架。但加载 NIB 时应用程序崩溃。
有没有办法根据固件版本加载NIB?假设我有 FirstView.xib 和 FirstView3X.xib
如何根据固件选择加载哪一个?
谢谢
PS:这是我在 StackOverflow 上的第一个问题!
这是我的问题:
我有一个在 iOS 3.0 上运行流畅的应用程序我一直在努力将它移植到 4.0 并包含新功能。
我使用 Interface Builder 添加了 iAd。
我知道我必须以编程方式定义它以仍然支持 3.0 设备。我弱链接了框架。但加载 NIB 时应用程序崩溃。
有没有办法根据固件版本加载NIB?假设我有 FirstView.xib 和 FirstView3X.xib
如何根据固件选择加载哪一个?
谢谢
PS:这是我在 StackOverflow 上的第一个问题!
恭喜您提出第一个问题 :-) 您如何加载笔尖?将界面拆分为多个文件是个好主意。我通常为每个控制器使用一个单独的 nib,并使用initWithNibName:bundle:
初始化程序加载它们。由于您在此处提供了 nib 名称,因此您可以轻松自定义加载行为。
如果您使用标签栏控制器加载笔尖,您可能会将所有标签放在一个笔尖中。我想我会将标签分成单独的笔尖并以编程方式加载它们:
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]。
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... */
}