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

初始化程序不会覆盖其父类中的指定初始化程序

令狐嘉运
2023-03-14
问题内容

因此,我刚刚升级到Xcode 6.3 Beta 3,出现了许多与以下内容有关的错误:

初始化程序不会覆盖其父类中的指定初始化程序。

override init() {
    super.init()
}

例如,这是一个UIButton类:

class CustomButton: UIButton {

    var target: AnyObject!
    var selector: Selector!
    var action: (() -> Void)!

    override init() { // Initializer does not override a designated initializer from its superclass
        super.init() // Must call a designated initializer of the superclass 'UIButton'
    }

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
    }
}

这是我的UIViewController课程之一:

class CustomAlertView: UIViewController {

    required init(coder aDecoder: NSCoder) {
        fatalError("NSCoding not supported")
    }

    required override init() { // Initializer does not override a designated initializer from its superclass
        super.init() // Must call a designated initializer of the superclass 'UIViewController'
    }

    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
    }
}

问题答案:

我的解决方案是一种快速解决方案,但我认为它比Apple在发行说明中的​​用途要容易。有关更多信息,请在此处搜索19775924
http://adcdownload.apple.com//Developer_Tools/Xcode_6.3_beta_3/Xcode_6.3_beta_3_Release_Notes.pdf。苹果公司所说的是您创建一个Objective-
C文件并将其扩展(必须将其添加到头文件及所有文件中),并且它位于“ Xcode 6.3 beta 3中的已知问题”上,所以我认为做我做的事情很容易:

这就是我为它修复的方式UIButton

class CustomButton : UIButton {
    init() {
        super.init(frame: CGRectZero)
    }

    required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

这是我的ViewController之一(如果不需要,请删除public):

public class GenericViewController: UIViewController {
    public init() {
        super.init(nibName: nil, bundle: nil)
    }

    required public init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

我不使用IB,所以也有UIView,因为我确实将视图与viewController((如果不需要的话,删除公共的)视图)分开:

public class GenericMenuView: UIView {
    public init() {
        super.init(frame: CGRectZero)
    }

    public required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

我在视图中特别需要此setupViews方法,因为我有一个在init上调用的所有子类中都覆盖的方法。并且使用AutoLayout我不需要任何框架(因此,我不会使用frame参数覆盖init)。

所以看来你必须放弃override。哦! 并确保不调用self.init()该类或该类从未初始化(并且在某些内部超时后崩溃)。



 类似资料:
  • 10.6.1.程序初始化 现在用户启动程序就会首先看到Timeline界面。但是用户必须先设置个人选项并启动Service,否则就没有消息显示。这很容易让人摸不着头脑。 一个解决方案是,在启动时检查用户的个人选项是否存在。若不存在,就跳到选项界面,并给用户一个提示,告诉她下一步该怎么做。 ... @Override protected void onCreate(Bundle savedInsta

  • 问题内容: 我对Swift类有疑问。我有一个UITableViewController类和UITableViewCell类的快捷文件。我的问题是UITableViewCell类和插座。此类存在错误 类别“ HomeCell”没有初始化程序 ,并且我不理解此问题。 感谢您的回复。 问题答案: 您必须使用隐式展开的可选变量,以便Swift可以在初始化阶段处理循环依赖关系(在这种情况下,UI组件的父级<

  • 初始化 Lotus 驱动程序 当安装 Lotus 数据库的驱动程序时,设置程序会在引擎的 Windows 注册表和 ISAM 格式子键写入一些缺省值。不要直接修改这些设置;请使用应用程序的设置程序来添加、删除、或更改这些设置。下面部分描述 Lotus 数据库驱动程序的初始化和 ISAM Format 设置。 Lotus 初始化设置 Jet\3.5\Engines\Lotus 文件夹包含用来访问外部

  • 我需要在OpenEJB中以“暂停”状态启动一个队列,以便在某些相关数据可用之前,消费者不会处理任何消息。我可以按此处所示以编程方式暂停队列,因此如果在创建队列时调用了一些初始化函数,我可以使用该方法。队列配置文档似乎不支持设置暂停状态。关于如何在创建时配置队列,有什么想法吗?

  • 问题内容: 我知道当我初始化一个char数组时: 要么 为什么不喜欢 初始化数组: 为什么它们不同?它是Java哲学的本质之一还是其​​背后的某些原因? 问题答案: 如果您曾经使用过 C ,那么答案就非常简单。在 C语言中 ,创建数组的方式是在堆栈上分配一个足以容纳元素数量的静态内存长度,并使用指针指向第一个元素-或堆上动态内存长度,然后用指针指向第一个元素。 在 C ++中 ,第二个版本已更改为

  • 根据此堆栈溢出问题的公认(且唯一)答案, 使用 将改为零初始化对象。 那么,为什么呢?, 生成此输出: 定义的两个构造函数都是默认的?正当对于POD类型,默认初始化为零初始化。 根据这个问题的公认答案, 如果POD成员未在构造函数中初始化,也未在类初始化中通过C11初始化,则默认为已初始化。 不管是堆栈还是堆,答案都是一样的。 在C 98中(而不是之后),new int()被指定为执行零初始化。