在从初始化程序返回之前不调用 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
RealmSwift 初始化程序:在 super.init 调用之前使用