我想要符合iOS 8中使用的UIAlertController,因为现在不推荐使用UIAlertView。有没有办法在不破坏对iOS 7的支持的情况下使用它?是否有某种if条件我可以检查iOS 8,否则为iOS 7支持做其他事情?
答案 0 :(得分:99)
我认为检查类是否存在(从iOS 4.2开始)的更好方法是:
if([ClassToBeChecked class]) {
// use it
} else {
// use alternative
}
在你的情况下,那将是:
if ([UIAlertController class]) {
// use UIAlertController
} else {
// use UIAlertView
}
答案 1 :(得分:12)
目标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!
答案 2 :(得分:4)
请看 Erwan 的答案(在我的回答下面),因为我觉得这是最好的。
-
您可以检查iOS版本以使用适当的控件:
if (([[[UIDevice currentDevice] systemVersion] compare:@"8.0" options:NSNumericSearch] == NSOrderedAscending)) {
// use UIAlertView
}
else {
// use UIAlertController
}
答案 3 :(得分:3)
正如其他人已经提到的那样 - 始终检查是否存在某个功能。我相信最安全的方法是:
if (NSClassFromString(@"UIAlertController")) {
// use UIAlertController
} else {
// use UIAlertView
}
存在输入带有拼写错误的类名的明显风险。 :)
来自 NClassFromString 的文档:
[返回]由aClassName命名的类对象,如果当前未加载该名称的类,则为nil。如果aClassName为nil,则返回nil。
可用性iOS(2.0及更高版本)
答案 4 :(得分:2)
在Swift中检查iOS版本的解决方案
switch (UIDevice.currentDevice().systemVersion.compare("8.0.0", options: NSStringCompareOptions.NumericSearch)) {
case .OrderedAscending:
println("iOS < 8.0")
case .OrderedSame, .OrderedDescending:
println("iOS >= 8.0")
}
此解决方案的结论:无论您采用哪种方式检查操作系统版本号,都是不好的做法。永远不应该以这种方式硬编码依赖关系,总是检查功能,功能或类的存在。考虑一下; Apple可能会发布类的向后兼容版本,如果他们这样做,那么您建议的代码永远不会使用它,因为您的逻辑查找操作系统版本号而不是类的存在。
检查类在Swift中是否存在的解决方案
if (objc_getClass("UIAlertController") == nil) {
// iOS 7
} else {
// iOS 8+
}
不要使用if (NSClassFromString("UIAlertController") == nil)
,因为它在使用iOS 7.1和8.2的iOS模拟器上正常工作,但如果您使用iOS 7.1在真实设备上进行测试,您将会发现您将永远不会通过其他部分代码片段。
答案 5 :(得分:1)
// Above ios 8.0
float os_version = [[[UIDevice currentDevice] systemVersion] floatValue];
if (os_version >= 8.000000)
{
//Use UIAlertController
}
else
{
//UIAlertView
}
答案 6 :(得分:1)
创建简单的utility function
以减少代码
代码:
// 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
}
了解更多选项Link
答案 7 :(得分:1)
我在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];
答案 8 :(得分:1)
我编写了一个包装UIAlertView并使用UIAlertController的类。因为程序员是透明的,因此足以在项目中导入这些类。这个类的实用程序是在旧项目中有更多UIAlertView要更改。链接:https://github.com/kennymuse/UIAlertView
答案 9 :(得分:0)
通过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的第三个lib处理向后兼容UIActionSheet和UIAlertView的iOS 7。
答案 10 :(得分:0)
尝试以下代码。它适用于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];
}