supportedInterfaceOrientations 方法不会覆盖其超类中的任何方法
Posted
技术标签:
【中文标题】supportedInterfaceOrientations 方法不会覆盖其超类中的任何方法【英文标题】:The supportedInterfaceOrientations method doesn't override any method from its superclass 【发布时间】:2016-12-08 13:07:23 【问题描述】:在 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,Build Settings
中Use Legacy Swift Language Version
设置为No
如何将上面的代码转换为 Swift 3?
【问题讨论】:
【参考方案1】:像这样:
override var supportedInterfaceOrientations : UIInterfaceOrientationMask
...剩下的就随你了。
一般模式
现在很多 Cocoa 方法都是属性,因此您可以将它们实现为覆盖计算变量。所以从种子 3(或更早)移动到种子 4 的模式是:
将func
更改为var
删除()
将->
更改为:
这是因为计算变量有一个 getter 函数,所以你之前实现的函数只是变成了 getter 函数。而且这些是只读属性,因此您不需要 setter。
受到类似影响的方法是preferredStatusBarStyle
、prefersStatusBarHidden
、shouldAutorotate
、preferredInterfaceOrientationForPresentation
等等。在 Objective-C 标头中查找 UIKIT_DEFINE_AS_PROPERTIES
。
含义
从长远来看,您还可以进行其他更改。例如,您可以添加一个setter(将您的实现分为get
和set
函数),因此您可以将您的实现变成存储属性的外观。例如:
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 方法的方式是通过 property,即通过实例变量。因此,只有 Swift 代码会受到更改的影响:您必须将方法重写为属性。
【讨论】:
你会经常这样做,所以现在就习惯吧。 :) 我添加了将方法覆盖转换为属性覆盖的具体步骤! 太棒了!只是等待接受您的回答所需的时间 等等,还有更多!还解释了为什么这种变化真的很酷。 @Aetherynne 已经快一年了,我不知道。以上是关于supportedInterfaceOrientations 方法不会覆盖其超类中的任何方法的主要内容,如果未能解决你的问题,请参考以下文章