【问题标题】:Super.init isn't called before returning from initializer在从初始化程序返回之前不调用 Super.init
【发布时间】: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' 的指定初始化程序

我能做什么? 非常感谢!

【问题讨论】:

    标签: ios uitableview error-handling swift2 xcode7


    【解决方案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;
      

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-05
        • 1970-01-01
        • 1970-01-01
        • 2020-12-17
        • 2020-07-06
        • 1970-01-01
        相关资源
        最近更新 更多