Bueno, para responder conceptualmente, su temporizador probablemente debería ser una subclase de en UIView
lugar de NSObject
.
Para crear una instancia de su temporizador en IB, simplemente arrastre una UIView
gota en la vista de su controlador de vista y configure su clase con el nombre de la clase de su temporizador.
Recuerda #import
su clase de temporizador en su controlador de vista.
Editar: para diseño IB (para instanciación de código, consulte el historial de revisiones)
No estoy muy familiarizado con el guión gráfico, pero sé que puede construir su interfaz en IB usando un .xib
archivo que es casi idéntico al uso de la versión del guión gráfico; Incluso debería poder copiar y pegar sus vistas como un todo desde su interfaz existente al.xib
archivo.
Para probar esto, creé un nuevo vacío .xib
llamado "MyCustomTimerView.xib". Luego agregué una vista, y a eso agregué una etiqueta y dos botones. Al igual que:
UIView
Creé una nueva subclase de clase de objetivo-C llamada "MyCustomTimer". En mi .xib
, configuré la clase Propietario de mi archivo como MyCustomTimer . Ahora soy libre de conectar acciones y salidas como cualquier otra vista / controlador. El .h
archivo resultante se ve así:
@interface MyCustomTimer : UIView
@property (strong, nonatomic) IBOutlet UILabel *displayLabel;
@property (strong, nonatomic) IBOutlet UIButton *startButton;
@property (strong, nonatomic) IBOutlet UIButton *stopButton;
- (IBAction)startButtonPush:(id)sender;
- (IBAction)stopButtonPush:(id)sender;
@end
El único obstáculo que queda por superar es conseguir esto .xib
en mi UIView
subclase. El uso de un .xib
reduce drásticamente la configuración requerida. Y dado que está utilizando guiones gráficos para cargar los temporizadores, sabemos que -(id)initWithCoder:
es el único inicializador que se llamará. Así que así es como se ve el archivo de implementación:
#import "MyCustomTimer.h"
@implementation MyCustomTimer
@synthesize displayLabel;
@synthesize startButton;
@synthesize stopButton;
-(id)initWithCoder:(NSCoder *)aDecoder{
if ((self = [super initWithCoder:aDecoder])){
[self addSubview:
[[[NSBundle mainBundle] loadNibNamed:@"MyCustomTimerView"
owner:self
options:nil] objectAtIndex:0]];
}
return self;
}
- (IBAction)startButtonPush:(id)sender {
self.displayLabel.backgroundColor = [UIColor greenColor];
}
- (IBAction)stopButtonPush:(id)sender {
self.displayLabel.backgroundColor = [UIColor redColor];
}
@end
El método llamado loadNibNamed:owner:options:
hace exactamente lo que parece. Carga el Nib y establece la propiedad "Propietario del archivo" en uno mismo. Extraemos el primer objeto de la matriz y esa es la vista raíz del Nib. Agregamos la vista como una subvista y listo, está en la pantalla.
Obviamente, esto solo cambia el color de fondo de la etiqueta cuando se presionan los botones, pero este ejemplo debería ayudarlo a avanzar.
Notas basadas en comentarios:
Vale la pena señalar que si tiene problemas de recursividad infinita, probablemente se haya perdido el truco sutil de esta solución. No está haciendo lo que crees que está haciendo. La vista que se coloca en el guión gráfico no se ve, sino que carga otra vista como una subvista. Esa vista que carga es la vista que se define en el nib. El "propietario del archivo" en la plumilla es esa vista invisible. Lo bueno es que esta vista invisible sigue siendo una clase Objective-C que se puede usar como una especie de controlador de vista para la vista que trae desde el nib. Por ejemplo, los IBAction
métodos de la MyCustomTimer
clase son algo que esperaría más en un controlador de vista que en una vista.
Como nota al margen, algunos pueden argumentar que esto se rompe MVC
y estoy algo de acuerdo. Desde mi punto de vista, está más relacionado con una costumbre UITableViewCell
, que a veces también tiene que ser parte del controlador.
También vale la pena señalar que esta respuesta fue para proporcionar una solución muy específica; cree una plumilla que se pueda instanciar varias veces en la misma vista que se presenta en un guión gráfico. Por ejemplo, podría imaginarse fácilmente seis de estos temporizadores en la pantalla de un iPad a la vez. Si solo necesita especificar una vista para un controlador de vista que se usará varias veces en su aplicación, entonces la solución proporcionada por jyavenard a esta pregunta es casi con certeza una mejor solución para usted.