2017-02-07 14 views
0

У меня есть протокол, какOverride UIButton BackgroundColor свойство с протоколом

protocol ButtonPresentable { 
    var backgroundColor: UIColor { get } 
} 

extension ButtonPresentable { 
    var backgroundColor: UIColor? { 
     return UIColor.red 
    } 

} 

У меня есть кнопка пользовательский класс (зачерпнуть IB), который реализует свой протокол

class MyButton: UIButton, ButtonPresentable { 
} 

Почему этот протокол не " переопределить 'родное свойство backgroundColor?

Я хотел бы иметь реализацию протокола по умолчанию, которая будет устанавливать фон по умолчанию для всех кнопок. Существует ли ориентированный на протокол способ установки значений по умолчанию для всех цветов фона UIButton?

EDIT: На самом деле я делаю что

protocol ButtonPresentable { 
    var pBackgroundColor: UIColor { get } 
} 

extension ButtonPresentable { 
    var pBackgroundColor: UIColor? { 
     return UIColor.red 
    } 

    func applyTheme() { 
     self.backgroundColor = pBackgroundColor 
    } 
} 

// In my custom view 
required init(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder)! 
    self.applyTheme() 
} 
+0

Добавить 'override' ключевое слово перед объявлением 'var'. Вы проверили это? – Adolfo

+0

@Adolfo Nope! Не работает – Ludovic

ответ

1

1. Почему этот протокол не ставиться родное свойство BackgroundColor?

Потому что: Extensions can add new functionality to a type, but they cannot override existing functionality.

Посмотрите на этот пример:

protocol ButtonProtocol { 
    var name: String { get } 
} 

extension ButtonProtocol { 
    var name: String { 
    return "button protocol" 
    } 
} 

class ButtonClass: ButtonProtocol { 
    var name: String = "button class" 
} 

let button = ButtonClass() 
print(button.name) // prints: button class 

2. Есть ли способ протокол ориентированный, чтобы установить значения по умолчанию для всех фоновых цветов UIButton?

И если вы хотите переопределение в backgroundColor всех кнопок, которые могли бы сделать это: когда кнопка установлена ​​с рамкой, вы можете изменить его цвет фона:

extension UIButton { 
    open override var frame: CGRect { 
    didSet { 
     self.backgroundColor = .red 
    } 
    } 
} 
+0

Все, что я пропустил! Благодарю. У вас был ответ на мой вопрос: существует ли ориентированный на протокол способ переопределить все цвета фона UIButton? Я понимаю ваш пример со строкой, но с цветами он не удобен для пользователя. Я обновляю свой вопрос. – Ludovic

+0

Нет другого способа расширения этого класса? – Ludovic

+1

Извлечен из документов apple (ссылка, предоставленная в ответе): 'Расширения могут добавлять новые инициализаторы удобства в класс, но они не могут добавлять новые назначенные инициализаторы или деинициализаторы в класс. Назначенные инициализаторы и деинициализаторы всегда должны быть обеспечены исходной реализацией класса. ' – Wilson

Смежные вопросы