Подтвердить что ты не робот

Почему я не должен подклассифицировать UIButton?

Я задал несколько вопросов о переполнении стека о подклассе UIButton, и несколько человек сообщили мне, что я не должен подклассифицировать UIButton.

Каковы негативы подкласса a UIButton? И я знаю, что это расплывчато, но что другие альтернативы для подкласса UIButton?

4b9b3361

Ответ 1

Фреймворки Cocoa используют подход, который шаблон шаблона объекта более уместен, чем традиционная иерархия классов.

В общем, это означает, что на UIButton, вероятно, будет свойство, где вы можете установить другой объект для обработки различных аспектов кнопки. Это предпочтительный способ "настроить", как работает ваша кнопка.

Одной из основных причин этого шаблона является то, что многие компоненты библиотеки создают кнопки и не знают, что вы хотите, чтобы они создавали экземпляры вашего подкласса.

изменить, собственный factory метод

Я заметил ваш комментарий выше о том, как сэкономить время, когда у вас есть одна и та же конфигурация кнопок на многих кнопках вашего приложения. Это отличное время для использования шаблона проектирования factory, а в Objective-C вы можете реализовать его с помощью категории, чтобы он был доступен напрямую на UIButton.

@interface UIButton ( MyCompanyFactory )
+(UIButton *) buttonWithMyCompanyStyles;
@end
@implementation UIButton
+(UIButton *) buttonWithMyCompanyStyles {
    UIButton *theButton = [UIButton buttonWithType:UIButtonTypeCustom];
    // [theButton set...
    return theButton;
}
@end

Ответ 2

Это потому, что UIButton является особым в том смысле, что существует несколько сложностей/тонкостей/ограничений (т.е. дополнительные переопределения для определения, особенно +buttonWithType:), необходимые для того, чтобы он работал как ожидалось. Это больше, чем обычный -initWithFrame:-initWithCoder:, если он используется в XIB). IDK, почему авторы рамок позволили этим деталям просочиться в наш домен, но это то, что нам нужно решать сейчас. Ограничение заключается в том, что ваша реализация не должна зависеть от стилей кнопок системы (например, расширенных); Вы должны принять UIButtonTypeCustom как отправную точку для подкласса UIButton.


При реализации подкласса UIButton

Ответ 3

Если вы просто ищете что-то более легкое с вашим собственным "subviews", вы должны вместо этого подклассифицировать UIControl. UIButton подклассы UIControl и могут обрабатывать события, например:

[mySubclassedButtonFromUIControl addTarget:self action:@selector(_doSomething:) forControlEvents:UIControlEventTouchUpInside];

UIControl подклассы UIView, чтобы вы могли чисто layoutSubviews в любых представлениях, содержащихся в вашем подклассе UIControl, и избегать ненужных представлений, которые поставляются с UIButton. По сути, вы просто создаете свой собственный "UIButton", но избегаете необходимости работать с поведением и функциональными возможностями, которые вам действительно не нужны или не нужны.