[swift]SupportedInterfaceOrientations 方法不重写任何从其超类的方法

标签: Xcode ios Swift
发布时间: 2017/3/6 23:19:38
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

在 UIViewController,此代码︰

public override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
    if let mainController = self.mainViewController{
        return mainController.supportedInterfaceOrientations
    }
    return UIInterfaceOrientationMask.all
}

给出错误Method doesn't override any method from its superclass

我使用 Xcode 8 beta 4 和 iOS 部署目标是 9.0,和 Use Legacy Swift Language Version 设置为不在Build Settings

如何可以转换到上述代码 Swift 3?

解决方法 1:

喜欢这个:

override var supportedInterfaceOrientations : UIInterfaceOrientationMask {

......并且休息因为你有它。

一般模式

大量的可可方法现在属性,所以您实现它们重写计算的变量。所以从种子 3 (或更早) 的模式到种子 4 是︰

  • 改变 funcvar

  • 删除()

  • 改变 ->:

这是因为计算的变量有 getter 功能,所以功能您之前只是变成了 getter 函数实现。而这些只读属性,所以你不需要二传手。

同样受影响的方法是 preferredStatusBarStyleprefersStatusBarHiddenshouldAutorotatepreferredInterfaceOrientationForPresentation ,和其他许多人。寻找 UIKIT_DEFINE_AS_PROPERTIES objective-c 标头中。

所涉问题

长远来说,在你可以做其他更改。例如,您可以添加二传手 (划分成你执行 getset 功能),从而变成一个门面为存储的属性中的您的实现。例如︰

private var _orientations = UIInterfaceOrientationMask.portrait
override var supportedInterfaceOrientations : UIInterfaceOrientationMask {
    get { return self._orientations }
    set { self._orientations = newValue }
}

因此,现在您的代码有一种设置此值。如果你在不同的时间返回不同的值的时候,这会使事情更干净许多。

进一步的技术说明

有趣的是,这种变化有没有直接的影响,对现有objective-c 代码,因为在objective-c,新的属性声明中, @property(nonatomic, readonly) UIInterfaceOrientationMask supportedInterfaceOrientations; ,像以前一样满足用同样的方法︰

- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}

原因是,在objective-c, @property(readonly) 是仅仅承诺了,相应的 getter 方法存在,而这正是此方法是什么。但在 Swift ,写objective-c 属性 getter 方法的方法是通过一个属性,那就是,通过一个实例变量。所以只有 Swift 代码受更改︰ 你不得不重写您作为属性的方法。

赞助商