titlelabel guidelines color buttons objective-c ios uibutton uikit subclass

objective c - guidelines - ¿Por qué no debería subclasificar un UIButton?



menu ios (3)

Esto se debe a que UIButton es un tanto especial ya que hay algunas complejidades / sutilezas / restricciones (es decir, anulaciones adicionales para que usted las defina, especialmente +buttonWithType: requeridas para que funcionen como se espera. Es más de lo habitual -initWithFrame: (y -initWithCoder: si se usa en XIB). IDK explica por qué los autores del framework permitieron que esos detalles se filtraran a nuestro dominio, pero es algo que debemos tratar ahora. La restricción es que su implementación no debe depender de (es decir, ampliar) los estilos de botones del sistema predefinidos; Debe asumir UIButtonTypeCustom como punto de partida para una subclase UIButton .

Al implementar una subclase de UIButton

He hecho algunas preguntas sobre el desbordamiento de la pila sobre la subclasificación de un UIButton , y un par de personas me han informado que no debo subclasificar un UIButton .

¿Cuáles son los UIButton negativos de la subclasificación de un UIButton ? Y sé que es vago, pero ¿qué otras alternativas existen para subclasificar un UIButton ?


Los marcos de trabajo de Cocoa toman el enfoque de que el patrón de Composición de Objetos es más apropiado que la jerarquía de clases tradicional.

En general, esto significa que es probable que exista una propiedad en UIButton donde puede configurar otro objeto para manejar varios aspectos del botón. Esta es la forma preferida de "personalizar" cómo funciona su botón.

Una de las razones principales de este patrón es que muchos componentes de la biblioteca crean botones y no saben que usted quiere que creen instancias de su subclase.

editar, su propio método de fábrica

Observé tu comentario anterior sobre el ahorro de tiempo cuando tienes la misma configuración de botón en muchos botones de tu aplicación. Este es un buen momento para usar el patrón de diseño de Método de Fábrica, y en Objective-C puede implementarlo con una Categoría para que esté disponible directamente en UIButton.

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


Si solo está buscando algo más liviano con sus propias ''subvistas'', debería estar subclasificando UIControl. UIButton subclasifica UIControl y puede manejar eventos, como:

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

UICiew subclasifica UIView para que pueda distribuir de forma clara las presentaciones en cualquier vista contenida en su subclase UIControl y evitar las vistas innecesarias que vienen con UIButton. Básicamente, estás creando tu propio ''UIButton'' pero evitas tener que trabajar con el comportamiento y la funcionalidad que realmente no deseas o no necesitas.