UIAlertController如果是iOS 8,否则是UIAlertView

Tri*_*Man 27 uialertview ios ios8 uialertcontroller

我想要符合iOS 8中使用的UIAlertController,因为现在不推荐使用UIAlertView.有没有办法在不破坏对iOS 7的支持的情况下使用它?是否有某种if条件我可以检查iOS 8,否则为iOS 7支持做其他事情?

Erw*_*wan 99

我认为检查类是否存在(从iOS 4.2开始)的更好方法是:

if([ClassToBeChecked class]) {

   // use it

} else {

  // use alternative

}
Run Code Online (Sandbox Code Playgroud)

在你的情况下,那将是:

if ([UIAlertController class]) {
   // use UIAlertController

} else {
  // use UIAlertView

}
Run Code Online (Sandbox Code Playgroud)

  • 这应该标记为正确答案.始终检查类/功能/常量/功能是否存在,而不是检查iOS版本. (9认同)
  • 是的,但是如果有人正在编译由具有ios 8 sdk的人编写的代码,但他们现在在xcode 5上使用ios 7 sdk,则代码将无法编译.这是@huey得到的问题,因为他正在编译xcode 5,UIAlertController将无法被识别.如果您使用的是最新的SDK,那么您的答案是正确的,因为当运行ios7的手机运行使用ios8构建的应用程序时,它将在[UIAlertController类]上返回nil. (2认同)
  • 是的,所以@huey不应该尝试在xcode 5上编译.他需要使用xcode 6并使用你的代码来防止在设备使用ios7时调用UIAlertController.我的评论是为了指出它没有编译的原因是该类在ios 7 sdk上不可用.但是,你的第一个回复说它将适用于ios7和xcode 5,如果该类不可用则不然. (2认同)

goc*_*oce 12

目标C(如上所述)

if ([UIAlertController class]) {
    // use UIAlertController

} else {
    // use UIAlertView

}
Run Code Online (Sandbox Code Playgroud)

迅速

if objc_getClass("UIAlertController") == nil  {
       // use UIAlertView 

} else {
  // use UIAlertController

}
Run Code Online (Sandbox Code Playgroud)

不要使用if NSClassFromString("UIAlertController") == nil它不起作用,因为此方法的签名是func NSClassFromString(_ aClassName: String!) -> AnyClass!


Tri*_*ian 4

请参阅Erwan的答案(在我的答案下方),因为我认为这是最好的。

--

您可以检查 iOS 版本以使用适当的控件,如下所示:

if (([[[UIDevice currentDevice] systemVersion] compare:@"8.0" options:NSNumericSearch] == NSOrderedAscending)) {
    // use UIAlertView
}
else {
    // use UIAlertController
}
Run Code Online (Sandbox Code Playgroud)

  • 这是执行此检查的一种脆弱方法。事实上,苹果公司不建议进行此类检查。Erwan的答案是正确答案。 (3认同)
  • 我在下面发布了我认为更好的方法,检查类是否存在而不是检查操作系统的版本 (2认同)