所以我刚刚升级到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)
}
}
答案 0 :(得分:42)
我的解决方案是一个快速解决方案,但我认为比发布说明中Apple的目的更容易。有关更多信息,请在此处搜索19775924 http://adcdownload.apple.com//Developer_Tools/Xcode_6.3_beta_3/Xcode_6.3_beta_3_Release_Notes.pdf。 Apple所说的是你创建一个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")
}
}
这是我的一个ViewControllers(如果不需要,则删除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()
,否则该类永远不会被初始化(并且在内部超时后它会崩溃)。
答案 1 :(得分:4)
根据Apple文档here,您要覆盖的是便捷初始化程序。因此,要使初始化程序正常工作,您必须将方法更改为
override convenience init() {
super.init()
}
除了调用超类初始化程序之外,你可以这样做,或删除初始化程序,如果你没有真正使用它。
答案 2 :(得分:3)
我认为这比看起来容易。
对于SKSpriteNode,我这样做:
override init() {
let texture = SKTexture(imageNamed: "bgTile")
super.init(texture: texture, color: nil, size: texture.size())
}
问题是init()不是SKSpriteNode的指定初始值设定项。所以我把它改成了:
override init(texture: SKTexture!, color: UIColor!, size: CGSize) {
let texture = SKTexture(imageNamed: "bgTile")
super.init(texture: texture, color: nil, size: texture.size())
}
现在工作正常。
答案 3 :(得分:1)
我最近想出了这个,我想解释一下问题是什么。最初在Apple Developer forums上回答。
似乎Swift已经改变了初始化程序依赖性检查或冒充初始化程序的策略。
现在,如果你的初始化者'如图所示,处理Xcode 6.3 Beta 2和Beta 3的一种方法是删除所有初始化程序定义:
class CustomButton: UIButton {
var target: AnyObject!
var selector: Selector!
var action: (() -> Void)!
}
class CustomAlertView: UIViewController {
}
在没有定义任何指定的初始值设定项的情况下,类继承其超类的所有初始值设定项。
一个非常简单的修复方法,但是让我感到难过的一大问题。
答案 4 :(得分:1)
错误解决方案:覆盖init(编码器aDecoder:NSCoder!)无法正常工作 - Swift
这对我有用,试试这个,注意:你必须唤醒笔尖
override func awakeFromNib() {
super.awakeFromNib()
// Initialisation code
}