supportedInterfaceOrientations方法不会覆盖其超类中的任何方法

时间:2016-08-03 01:33:41

标签: ios swift xcode

在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 个答案:

答案 0 :(得分:75)

像这样:

override var supportedInterfaceOrientations : UIInterfaceOrientationMask {

......其余的就像你拥有它一样。

一般模式

现在很多Cocoa方法都是属性,所以你将它们实现为覆盖计算变量。因此从种子3(或更早)移动到种子4的模式是:

  • func更改为var

  • 删除()

  • ->更改为:

这是因为计算变量有一个getter函数,所以你之前实现的函数只是变成了getter函数。这些是只读属性,因此您不需要设置器。

同样受影响的方法包括preferredStatusBarStyleprefersStatusBarHiddenshouldAutorotatepreferredInterfaceOrientationForPresentation以及其他许多方法。在Objective-C标题中查找UIKIT_DEFINE_AS_PROPERTIES

启示

从长远来看,您可以进行其他更改。例如,您可以添加一个setter(将您的实现划分为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代码才会受到更改的影响:您必须将方法重写为属性。