在从初始化程序返回之前不调用 Super.init

Posted

技术标签:

【中文标题】在从初始化程序返回之前不调用 Super.init【英文标题】:Super.init isn't called before returning from initializer 【发布时间】:2015-09-01 20:05:03 【问题描述】:

我尝试为我的 UITableViewCell 类提供一个自定义初始化程序,但我无法弄清楚我做错了什么。

这是我的代码:

init(dataObject: [NSManagedObject]!, objectAttributeValues: [String]!,placeholder: String!, segmentedControl: UISegmentedControl?, cellHeight: CGRect, cellWidth: CGRect) 
    self.dataObject = dataObject
    self.Placeholder.text = placeholder
    self.objectAttributeValues = objectAttributeValues

    if segmentedControl != nil 
        self.segmentedControl = segmentedControl!
        didHaveSegmentedControl = true
    



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

我试图调用 super.init(frame: CGRect(...)) 但通过实现这个我得到另一个错误:必须调用超类 'UITableViewCell' 的指定初始化程序

我能做什么? 非常感谢!

【问题讨论】:

【参考方案1】:

初始化器的工作方式是,它们会将自己的属性、常量和函数添加到该实例,然后回调超类以获取其类型的对象。更多信息here。

因此,您必须在退出初始化程序之前调用超类的初始化程序。在这里,我建议您在初始化程序的最后一行调用super.init()。您可以选择UITableViewCell 上的init 方法中的哪一个最合适。

【讨论】:

如果我调用 'super.init()' 会出现错误“必须调用超类“UITableViewCell”的指定初始化程序”... 您必须调用其他初始化程序之一,具体取决于您要执行的操作。检查自动完成以获取更多信息。【参考方案2】:
    override init(frame: CGRect) 
        super.init(frame: frame)
    
    convenience init(frame: CGRect, dataObject: [NSManagedObject]!, objectAttributeValues: [String]!,placeholder: String!, segmentedControl: UISegmentedControl?, cellHeight: CGRect, cellWidth: CGRect)
        self.init(frame: frame)
        self.dataObject = dataObject
        self.Placeholder.text = placeholder
        self.objectAttributeValues = objectAttributeValues

        if segmentedControl != nil 
            self.segmentedControl = segmentedControl!
            didHaveSegmentedControl = true
        

    

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

希望对你有帮助Override init method of UIView in swift

【讨论】:

【参考方案3】:

你必须调用超类指定的初始化器。

例如,我尝试创建UIView 的子类,但遇到了与您完全相同的问题。 UIView 的指定初始化程序是 super.init(frame: CGRect) 对于UITableViewCell,指定的初始化器如下。

// Designated initializer.  If the cell can be reused, you must pass in a reuse 
identifier.  You should use the same reuse identifier for all cells of the same 
form.  
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier: 
(nullable NSString *)reuseIdentifier NS_AVAILABLE_ios(3_0) 
NS_DESIGNATED_INITIALIZER;
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder 
NS_DESIGNATED_INITIALIZER;

希望这会有所帮助。

【讨论】:

以上是关于在从初始化程序返回之前不调用 Super.init的主要内容,如果未能解决你的问题,请参考以下文章

在从初始化程序返回之前,不会在所有路径上调用 super init

从初始化程序返回之前不会调用Super.init

RealmSwift 初始化程序:在 super.init 调用之前使用

CoreData 和 Codable 类编译器错误:在从初始化程序返回之前,未在所有路径上调用“self.init”

super.init() 无法在 swift3 中调用

super.init(config)调用的原理