【问题标题】:showViewController Not WorkingshowViewController 不工作
【发布时间】:2014-11-15 09:27:26
【问题描述】:

我正在 SWIFT 中开发一个应用程序,我正在使用以下代码在按钮单击时显示视图控制器。

let storyboard = UIStoryboard(name: "Main", bundle: nil);
var viewName:NSString = "websiteView"
let vc = storyboard.instantiateViewControllerWithIdentifier(viewName) as WebsiteViewController
self.showViewController(vc, sender: self)

当我为 ios 8 测试它时它工作得很好,但在 ios 7 上,无论我做什么,我都会收到以下错误消息。我在一个论坛上看到 self.showViewController 仅适用于 ios 8 但编译器不会抛出错误,有人知道我是否可以使用它吗?

showViewController:sender:]: unrecognized selector sent to instance 0x7f9552e7cc50

2014-11-15 09:25:49.565 Throw[80595:613] *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[Throw.test showViewController:sender:]:无法识别的选择器发送到实例 0x7f9552e7cc50'

【问题讨论】:

  • 可能的原因是编译器不知道代码将在哪个设备上运行,您可以在运行时检查函数是否存在。

标签: ios xcode swift xcode6


【解决方案1】:

编译器没有抛出错误,因为您选择了 iOS 8.0(或 8.1)SDK。该方法确实仅适用于 iOS 8.0+。如果你有条件地调用它,你可以选择使用它,像这样:

if (self.respondsToSelector(Selector("showViewController"))) {
    self.showViewController(vc, sender: self)
} else {
    //An example of the alternate if you are using navigation controller
    self.navigationController?.pushViewController(vc, animated: true)
}

【讨论】:

  • 嗯...那会是什么?有相同功能的 iOS7 版本吗?
  • 根据您的意图和设置,presentViewController、[self.navigationController pushViewController] 等。
【解决方案2】:

你可以使用:

self.navigationController?.pushViewController(vc as WebsiteViewController, animated: true)

兼容 iOS 7 和 iOS 8

【讨论】:

    【解决方案3】:

    更新 - 来自 swift2 的更好和推荐的 API 版本兼容性检查方法

    if #available(iOS 8, *) {
       self.showViewController(vc, sender: self)
    } else {
      self.navigationController?.pushViewController(vc, animated: true)
    }
    

    奖励:使用 @available 属性来装饰单个函数或整个类,这将为您自己的 API 提供编译时版本检查

    @available(iOS 8, *)
    func compatibalityCheckForiOS8() -> Void { }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-02
      • 1970-01-01
      • 2021-01-10
      • 1970-01-01
      • 2019-01-19
      • 1970-01-01
      • 2018-12-22
      • 2016-04-19
      相关资源
      最近更新 更多