为什么我必须对我的程序化UIViewController子类的init(coder aDecoder)声明相同的必需但未实现的初始化程序?

问题描述 投票:4回答:4

也许只是我,但是我发现某些方面迅捷...至少可以说是令人困惑。

我通常不使用Interface Builder,因为我喜欢使用PureLayout。因此,我希望创建一个UIViewController子类,例如PureViewController,该子类具有方便的init而没有参数:

class PureViewController : UIViewController {

    init() {
        super.init(nibName: nil, bundle: nil)
    }

}

但这不行,因为XCode告诉我我也必须实现init(coder aDecoder: NSCoder)。好的,很好!这就是为什么我要上这个课-所以我不必再为子类做这个。

class PureViewController : UIViewController {

    init() {
        super.init(nibName: nil, bundle: nil)
    }

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

}

好,现在这是我不明白的。

我用初始化程序SomePureViewController : PureViewController定义了子类init(viewModel:ICrackersViewModel) ...

class SomePureViewController : PureViewController {

    init(viewModel:ICrackersViewModel) {
        super.init()
    }

}

但是它STILL

要我定义相同的愚蠢的初始化程序,直到王国来临!
class SomePureViewController : PureViewController {

    init(viewModel:ICrackersViewModel) {
        super.init()
    }

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

}

现在,我明白了这个想法-即使在其父类中定义了init(decoder),我的子类中也没有。

也许我一直用UIViewController处理此问题,但以前从未注意到它。

我的问题如下:

  1. 我做错了什么导致此行为吗?
  2. 继承之外,有什么方法可以避免重复我自己?
  3. 是否有任何计划要对此进行更改?

也许只是我,但我发现某些方面很快……至少可以说是钝头。我大部分时间都不使用Interface Builder,因为我喜欢使用PureLayout。所以我希望做一个...

ios swift uiviewcontroller designated-initializer
4个回答
2
投票

重点是,只要知道基本类型就可以初始化可能派生的类。


1
投票

我认为这是一个迅速的问题,没有办法避免这种情况。我们都讨厌这个空的-致命错误初始化器。


1
投票

由于初始化程序标记有required关键字,所有子类都必须实现该初始化程序,并且它们还必须在其实现中指定required,以便也需要their


0
投票

你们是否找到了使用Storyboard避免此错误并初始化可编码结构的最佳方法? Xcode需要编写此行,并且在运行应用程序时会崩溃:

© www.soinside.com 2019 - 2024. All rights reserved.