UIAlertController如果iOS 8,否则UIAlertView

我想符合iOS 8中使用的UIAlertController,因为UIAlertView现在已经被弃用了。 有没有一种方法,我可以使用这个没有打破支持iOS 7? 是否有某种条件,我可以做检查iOS 8,否则做iOS 7支持的其他条件?

请看Erwan的答案(在我的答案下面),因为我认为这是最好的。

您可以检查iOS版本以使用适当的控制,如下所示:

 if (([[[UIDevice currentDevice] systemVersion] compare:@"8.0" options:NSNumericSearch] == NSOrderedAscending)) { // use UIAlertView } else { // use UIAlertController } 

我想一个更好的方法来检查一个类是否存在(自iOS 4.2以来)是:

 if([ClassToBeChecked class]) { // use it } else { // use alternative } 

在你的情况下,这将是:

 if ([UIAlertController class]) { // use UIAlertController } else { // use UIAlertView } 

目标C(如上所述)

 if ([UIAlertController class]) { // use UIAlertController } else { // use UIAlertView } 

迅速

 if objc_getClass("UIAlertController") == nil { // use UIAlertView } else { // use UIAlertController } 

不要使用if NSClassFromString("UIAlertController") == nil它不工作,因为这个方法的签名是func NSClassFromString(_ aClassName: String!) -> AnyClass!

正如其他人已经提到 – 总是检查function是否存在。 我相信最安全的做法如下:

 if (NSClassFromString(@"UIAlertController")) { // use UIAlertController } else { // use UIAlertView } 

input类名错误的风险显而易见。 🙂

NClassFromString的文档:

[返回]由aClassName指定的类对象,如果当前没有加载该名称的类,则返回nil。 如果aClassName是零,则返回nil。

可用性iOS(2.0及更高版本)

在Swift中检查iOS版本的解决scheme

 switch (UIDevice.currentDevice().systemVersion.compare("8.0.0", options: NSStringCompareOptions.NumericSearch)) { case .OrderedAscending: println("iOS < 8.0") case .OrderedSame, .OrderedDescending: println("iOS >= 8.0") } 

这个解决scheme的概念:检查操作系统版本号,无论采用哪种方式,都是不好的做法。 一个人不应该以这种方式硬编码依赖关系,总是检查function,能力或类的存在。 考虑这个; 苹果可能会发布一个向后兼容的类,如果他们这样做,那么你build议的代码将永远不会使用它,因为你的逻辑查找操作系统的版本号,而不是类的存在。

( 这个信息的来源 )

在Swift中检查类的存在的解决scheme

 if (objc_getClass("UIAlertController") == nil) { // iOS 7 } else { // iOS 8+ } 

不要使用if (NSClassFromString("UIAlertController") == nil)因为它可以在使用iOS 7.1和8.2的iOS模拟器上正常工作,但是如果你在使用iOS 7.1的真实设备上testing,你将不会注意到,通过代码片段的其他部分。

 // Above ios 8.0 float os_version = [[[UIDevice currentDevice] systemVersion] floatValue]; if (os_version >= 8.000000) {   //Use UIAlertController } else { //UIAlertView } 

创build简单的utility function来减less代码

CODE:

 // pass minimum required iOS version BOOL isOSSupported(NSString *minRequiredVersion) { NSString *currSysVer = [[UIDevice currentDevice] systemVersion]; BOOL isOSSupported = ([currSysVer compare:minRequiredVersion options:NSNumericSearch] != NSOrderedAscending) && ![currSysVer isEqualToString:@"Unknown"]; return isOSSupported; } 

使用 :

 if(isOSSupported("8.0") { // Code for iOS8 and above } else { // Code for iOS7 and below } 


或者按如下所示使用系统常量NSFoundationVersionNumber_iOS_7_1

 if(floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_7_1) { // Code for iOS8 and above } else { // Code for iOS7 and below } 

为更多的select链接

我在Objective-C中创build了非常简单的包装,它支持旧的iOS UIAlertView和新的UIAlertViewController

https://github.com/MartinPerry/UIAlert/

它也将旧的UIAlertView的新的动作块的使用

样品:

 MyAlertMessage * a = [[MyAlertMessage alloc] initWithTitle:@"Hello" WithMessage:@"World"]; [a addButton:BUTTON_OK WithTitle:@"OK" WithAction:^(void *action) { NSLog(@"Button OK at index 0 click"); }]; [a addButton:BUTTON_CANCEL WithTitle:@"Cancel" WithAction:^(void *action) { NSLog(@"Button Cancel at index 1 click"); }]; [a show]; 

我写了一个包装UIAlertView并使用UIAlertController的类。 对于程序员来说是透明的,因此在项目中足够导入这个类。 这个类的实用程序是在旧项目中有更多的UIAlertView更改。 链接: https : //github.com/kennymuse/UIAlertView

方法一

由ios系统版本检查

 #define iOSVersionLessThan(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending) // below ios8 ,create UIAlertView if(iOSVersionLessThan(@"7.0")){ // todo // ios8 and above ,UIActionController avaliable }else{ // todo } 

方法二

通过系统特征检测

 // create UIActionController if([UIActionController class]){ // todo // create UIAlertView }else{ // todo } 

但是,还有第三个名为PSTAlertController的库 ,它处理向后兼容UIActionSheet和U​​IAlertView的iOS 7。

参考

  • 支持多个版本的iOS
  • 支持iOS 6
  • 支持多个iOS版本和设备

尝试下面的代码。 它适用于iOS 8及以下版本。

 if (IS_OS_8_OR_LATER) { UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:title message:msg preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) { }]; [alertVC addAction:cancelAction]; [[[[[UIApplication sharedApplication] windows] objectAtIndex:0] rootViewController] presentViewController:alertVC animated:YES completion:^{ }]; } else{ UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title message:msg delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil]; [alert show]; }