当前位置: 首页 > 面试题库 >

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

张晨朗
2023-03-14
问题内容

在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 VersionBuild Settings

如何将上面的代码转换为Swift 3?


问题答案:

像这样:

override var supportedInterfaceOrientations : UIInterfaceOrientationMask {

…还有其余的。

一般模式

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

  • 更改funcvar

  • 删除 ()

  • 更改->:

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

同样受影响的方法是preferredStatusBarStyleprefersStatusBarHiddenshouldAutorotatepreferredInterfaceOrientationForPresentation,和其他许多人。UIKIT_DEFINE_AS_PROPERTIES在Objective-
C标头中查找。

含义

从长远来看,您还可以进行其他更改。例如,您 可以
添加一个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中,a
@property(readonly)只是一个承诺,即存在相应的getter方法,而这正是该方法的含义。但是在Swift中,编写Objective-
C属性的getter方法的方法是通过 属性 ,即通过实例变量。因此,只有Swift代码受更改的影响:您必须将方法重写为属性。



 类似资料:
  • 问题内容: 我更新到Xcode 8 beta 5,现在在从UIView继承的类上收到以下错误: 有解决方法吗? 问题答案: 请检查最新参考。(您只需在Apple开发者网站的搜索栏中输入“ intrinsicContentSize”,就可以轻松找到它。) 宣言 已成为计算属性,因此您需要以这种方式覆盖它: 或者简单地:

  • 问题内容: 由于Xcode 6在Swift中仍然存在很多错误,因此我不确定是其中之一还是缺少某些东西。我的班采用协议NSLayoutManagerDelegate。但是似乎无法覆盖我需要的方法。我做的文档描述如下: 但是我在这里遇到错误:方法不会覆盖其超类中的任何方法。我该怎么办? 问题答案: 是的,您正在从协议中实现方法,但这不是替代。只需删除关键字。覆盖是指您的超类也实现该方法,并且您要提供一

  • 我有3个类,配置如下:Class1有几个方法,其中一些是抽象的: 接下来,来自同一个包的class 2扩展了class 1,覆盖了它的抽象方法并添加了一些其他方法: 最后,另一个包中的class3扩展了class2并覆盖了class1中的一个方法: 我正在使用Eclipse,并且它在编码时不会检测到任何错误。我正在使用Maven Build构建项目,但构建失败,说thisIsTheMethod o

  • 我正在尝试对涉及DStreams的Spark Streaming应用程序执行一些单元测试。 我发现下面这套很有用:StreamingSuiteBase。它包含一个名为testOperation的方法,您可以向该方法传递一个输入、一个要测试的操作和一个预期的输出。它将验证您的预期输出是否与实际输出相匹配。 我面临的问题是,在相等验证期间,我确实得到了完全相同的对象,但包装成不同的集合: 预期:列表(

  • 我们在项目的模块P中有一个接口。我们正在使用maven构建代码。界面如下 在类中重写,并使用模块Q的注释来实现。maven构建工作正常很多天了。 我为这个界面添加了一个新方法 我已经用注释覆盖了Class中的这个方法,并执行了构建。构建抛出错误 方法不会重写或实现超类型中的方法 我已经正确添加了模块的配置。我正在使用Java1.8。请让我知道缺少任何配置。 在这个链接中也发现了同样的错误。 我也尝

  • 问题内容: 我有一个大型的检票口组件库,这些检票口组件使用自定义注释或另一个注释进行注释,该注释具有一个参数以允许多个注释。 这是一个示例代码片段: 到目前为止,我使用apt来检查引用的资源是否确实存在。例如 除非在类路径中找到该文件,否则将导致编译失败。这部分效果很好。 现在,我还是DRY的粉丝,我想使用相同的注释在创建对象时将其实际注入到对象中。使用AspectJ,我已经实现了其中的一部分。