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和UIAlertView的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]; }