由于UIAlertView现在已被弃用,我希望使用iOS 8中使用的UIAlertController。是否有一种方法可以在不破坏对iOS 7支持的情况下使用它?是否可以进行某种if条件检查以检查iOS 8,否则为iOS 7支持执行其他操作?
由于UIAlertView现在已被弃用,我希望使用iOS 8中使用的UIAlertController。是否有一种方法可以在不破坏对iOS 7支持的情况下使用它?是否可以进行某种if条件检查以检查iOS 8,否则为iOS 7支持执行其他操作?
我认为一个更好的检查类是否存在的方法(自从iOS 4.2起)是:
if([ClassToBeChecked class]) {
// use it
} else {
// use alternative
}
在你的情况下,那将是:
if ([UIAlertController class]) {
// use UIAlertController
} else {
// use UIAlertView
}
Objective 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!
,所以它无法正常工作。
if (([[[UIDevice currentDevice] systemVersion] compare:@"8.0" options:NSNumericSearch] == NSOrderedAscending)) {
// use UIAlertView
}
else {
// use UIAlertController
}
正如其他人已经提到的-始终检查功能是否存在。我认为最安全的方法是遵循以下步骤:
if (NSClassFromString(@"UIAlertController")) {
// use UIAlertController
} else {
// use UIAlertView
}
当然存在输入错误的类名风险。 :)
从 NClassFromString 的文档中:
[返回] 名为 aClassName 的类对象,如果当前没有该名称的类,则返回 nil。如果 aClassName 为 nil,则返回 nil。
iOS(2.0 及更高版本)可用
switch (UIDevice.currentDevice().systemVersion.compare("8.0.0", options: NSStringCompareOptions.NumericSearch)) {
case .OrderedAscending:
println("iOS < 8.0")
case .OrderedSame, .OrderedDescending:
println("iOS >= 8.0")
}
if (objc_getClass("UIAlertController") == nil) {
// iOS 7
} else {
// iOS 8+
}
if (NSClassFromString("UIAlertController") == nil)
,因为它在使用iOS 7.1和8.2的iOS模拟器上可以正常工作,但是如果你在使用iOS 7.1的真实设备上测试,你会不幸地发现你永远无法通过代码片段的else部分。我已经用Objective-C创建了一个非常简单的包装器,支持旧的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];
// 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
}
更多选项请访问链接
// Above ios 8.0
float os_version = [[[UIDevice currentDevice] systemVersion] floatValue];
if (os_version >= 8.000000)
{
//Use UIAlertController
}
else
{
//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的问题。
UIAlertView
。这将使您的代码更简单。 - rmaddy