【问题标题】:UIAlertView/UIAlertController compatibility for iOS 7iOS 7 的 UIAlertView/UIAlertController 兼容性
【发布时间】: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 上运行良好。

标签: ios swift deprecated


【解决方案1】:

您可以简单地查看设备版本,并在此基础上实例化UIAlertControllerUIAlertView

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];

【讨论】:

  • 感谢您介绍自定义处理程序。因为我想把事情简单化,所以这次我不使用你的处理程序......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-05
  • 2016-03-18
  • 2015-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多