Swift 2 API 故事板的可用性检查

Swift 2 API Availability Check for storyboard

我有一个现有的 iOS 应用程序,它受 iOS 支持 8. 我只想为 iOS 添加新功能 9.

我为 iOS 9 创建了一个新的故事板,它使用了 iOS 9 的功能,如 UIStackView。根据设备 OS 版本实例化适当的故事板文件。

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    let storyboard: UIStoryboard
    if #available(iOS 9, *, *) {
        storyboard = UIStoryboard(name: "Main", bundle: nil)
    } else {
        storyboard = UIStoryboard(name: "MainOld", bundle: nil)
    }
    let mainViewController = storyboard.instantiateInitialViewController()
    window?.rootViewController = mainViewController
    window?.makeKeyAndVisible()
    return true
}

但是我在 Main.storyboard "UIStackView before iOS 9.0"

上遇到编译错误

我正在使用 Xcode 7 beta 5。

如何在 iOS 8 个支持的项目上使用 iOS 9 个相关功能 Swift 2 #availability check

您不能在 StoryBoard 中使用此类 #availability 功能。如果您想用 UIStackView 支持 iOS 8,您应该从代码中构建 UIStackView,或者使用第三方的兼容库。喜欢 OAStackView or TZStackView.

我从 Apple Cocoa 开发者电子邮件列表中的 Quincey Morris 那里得到了答复。

默认 在故事板文件的文件检查器中为构建的设置是"deployment Target",即iOS 8,因此编译器会抛出错误。

如果我在使用 iOS 9 功能的故事板上将 "Build for" 设置更改为 iOS 9。没有错误,应用程序在 iOS 8 和 iOS 9 中运行。

我创建了两个故事板,一个用于 iOS 8,另一个用于 iOS 9 及以上。 对于 iOS 9 故事板,转到文件检查器并将最小目标设置为 iOS 9,将 iOS8 设置为 iOS 8。

然后在代码中,无论您在何处为该故事板创建初始视图控制器,请使用:

if #available(iOS 9.0, *) {
    // create view controller from iOS 9 storyboard 
} else { 
    //create view controller from iOS 8 storyboard
}

错误应该消失了。显然需要管理更多的代码,但你得到了你的原生 UIStack,当你放弃 iOS8 支持时,你仍然拥有功能齐全的 ios9 故事板