iOS 7 的 UIAlertView/UIAlertController 兼容性
Posted
技术标签:
【中文标题】iOS 7 的 UIAlertView/UIAlertController 兼容性【英文标题】:UIAlertView/UIAlertController compatibility for iOS 7 【发布时间】:2015-11-16 06:03:48 【问题描述】:我已阅读UIAlertView/UIAlertController ios 7 and iOS 8 compatibility 线程并尝试实现以下内容:
if objc_getClass("UIAlertController") != nil
print("UIAlertController can be instantiated")
//make and use a UIAlertController
else
print("UIAlertController can NOT be instantiated")
//make and use a UIAlertView
但是在我的环境中,带有 OS X El Capitan 的 Xcode 7.1.1,如果我将部署目标设置为 iOS 7.1,Xcode 会报告有关 UIAlertController 的错误并通过添加可用性来修复它们,如下所示:
if #available(iOS 8.0, *)
alertContoller1(alertTitle, alertMessage: alertMessage)
和
@available(iOS 8.0, *)
func alertContoller1(alertTitle: String, alertMessage: String)
let alertController = UIAlertController(title: alertTitle, message: alertMessage, preferredStyle: .Alert)
let okAction = UIAlertAction(title: "OK", style: .Default)
(action) -> Void in
print("OK button tapped.")
alertController.addAction(okAction)
presentViewController(alertController, animated: true, completion: nil)
然后,当我使用 iOS 模拟器 7.1 (Xcode 6.4) 测试我的应用程序时,我的应用程序立即崩溃。
其次,当我尝试用 Xcode 6.4 打开我的项目时,有两个问题。
1.available(iOS 8.0, *)
部分出现编译错误。
2.如果我删除available(iOS 8.0, *)
部分,我的应用程序会崩溃并出现alertController
实例化错误
所以,这是一种“如果我对一个人是真的,我对另一个人就一定是假的”的情况
我想确认是否真的可以创建同时兼容iOS7.1和iOS8.0及更高版本的警报?
根据我对android软件开发的了解,有注解@targetAPI和@SuppressWarnings("deprecation")。有没有等价的功能?
如果苹果的意图是切断旧设备,谁来拯救那些拥有旧设备的人?
【问题讨论】:
我曾经为 UIAlertController/UIAlertView 写过一个 swift 示例:Adding a simple UIAlertView. 您的 7.1 模拟器可以在 El Capitan 中运行吗?因为我的没有。可能是问题所在。 尝试在7.1模拟器中运行一个空项目。 @FreeNickname 我也无法在 El Capitan 上运行 iOS7.1 模拟器。所以我在我的另一台 Mac (Yosemite/Xcode6.4) 上运行 iOS7.1 模拟器。在Yosemite/Xcode6.4中,不能使用available(iOS 8.0, *)
版本检查...
是的,问题是你要么坚持使用新的 Xcode 7+,要么坚持使用旧的 6.4。如果你坚持使用 7+,#availability 会起作用,但你需要一个设备来测试 iOS 7。但如果你使用 Xcode 6.*,你将不得不忘记 Swift 2.0。一种可能的解决方案(虽然有点烦人)是降级到 Yosemite 并使用 Xcode 7.1。据我所知,iOS 7 模拟器应该可以在 Yosemite 上运行良好。
【参考方案1】:
您可以简单地查看设备版本,并在此基础上实例化UIAlertController
或UIAlertView
if Float(UIDevice.currentDevice().systemVersion) >= 8
print("Instantiate UIAlertController")
else
print("Instantiate UIAlertView")
替换@available(iOS 8.0, *)
@available(iOS 7, *)
func iOS7Work()
// do stuff
if #available(iOS 8, *)
iOS8Work()
【讨论】:
对不起,我的问题是,如果我将部署目标设置为iOS7.1,Xcode7上需要UIAlertController
相关语句available(iOS 8.0, *)
。
那么问题是什么?只是说它需要iOS 8.0或更高版本
如果我在 Xcode7.1.1/El Capitan 上使用 available(iOS 8.0, *)
构建应用程序并将应用程序复制到 iOS7.1 模拟器,它会崩溃。此外,我无法在 Xcode6.4/Yosemite 上使用 available(iOS 8.0, *)
构建应用程序。即我无法同时接受 Xcode7.1.1/El Capitan/iOS8 和 Xcode6.4/Yosemite/iOS7.1 的代码...
使用 Xcode7,1 在 iOS 7.1 上构建代码似乎非常困难。就是这样。如果我们想支持 iOS 7,请继续使用 Xcode 6.4。如果您想使用 Xcode 7,请放弃对 iOS 7 的支持。
@Sohil-R-Memon 我根据您的建议修改了代码。适用于 iOS9 模拟器。但是在 iOS 7.1 模拟器上构建应用程序会立即崩溃。当然,我无法在 Xcode6.4 上使用该代码构建应用程序......太伤心了......【参考方案2】:
我为此创建了一个自定义处理程序, 您可以使用 https://github.com/ogres/CUIAlertController ,它是 UIAlertView 的简单替换,它将使用 UIAlertView 用于旧 iOS 版本和 AlertController 用于新版本。
您可以为 Swift 导入并采用它,或者查看源代码并创建类似的行为,
使用很简单
NSMutableArray *actions = [[NSMutableArray alloc] init];
[actions addObject:[CUIAlertAction actionWithTitle:@"Red" block:^
self.view.backgroundColor = [UIColor redColor];
]];
[actions addObject:[CUIAlertAction actionWithTitle:@"Green" block:^
self.view.backgroundColor = [UIColor greenColor];
]];
[actions addObject:[CUIAlertAction actionWithTitle:@"Cancel" block:nil]];
[CUIAlertController presentAlertViewWithTitle:@"Color"
message:@"Change background color"
actions:actions
fromController:self
animated:YES];
【讨论】:
感谢您介绍自定义处理程序。因为我想把事情简单化,所以这次我不使用你的处理程序......以上是关于iOS 7 的 UIAlertView/UIAlertController 兼容性的主要内容,如果未能解决你的问题,请参考以下文章
带有自定义声音的 UILocalNotification 仅适用于 iOS 6.1 和 iOS 7.1,不适用于 iOS 7.0
使用 xcode 5 (iOS 7 sdk) 构建 iOS 7 UI
Ipad图标大小Ipad设置ios 5-7 29pt 1x 2x - iPad聚光灯ios 7 40 pt - iPad app ios 7 76 pt [关闭]
iOS 7中的iOS 7 AVPlayer AVPlayerItem持续时间不正确