Super.init не вызывается перед возвратом из инициализатора

Я пытаюсь дать свой UITableViewCell Class собственный инициализатор, но я не могу понять, что я делаю неправильно.

Вот мой код:

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

Как работают инициализаторы, они добавят свои собственные свойства, константы и функции к этому экземпляру, а затем вернутся к суперклассу для объекта этого типа. Подробнее здесь.

По этой причине вы должны вызывать инициализатор суперкласса перед выходом из инициализатора. Здесь я предлагаю вам позвонить super.init() в последнюю строку вашего инициализатора. Вы можете выбрать, какой из методов 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")
    }

Я надеюсь, что это поможет вам Переопределить метод инициализации UIView в быстром

Ответ 3

Вы должны вызвать инициализатор суперкласса.

Например, я попытался создать подкласс UIView и у 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;

Надеюсь, это помогло.