Bene, per rispondere concettualmente, il tuo timer dovrebbe probabilmente essere una sottoclasse di UIView
invece di NSObject
.
Per istanziare un'istanza del tuo timer in IB, trascinala semplicemente e UIView
rilasciala nella vista del controller di visualizzazione e imposta la sua classe sul nome della classe del tuo timer.
Ricorda #import
la classe del timer nel controller della vista.
Modifica: per la progettazione IB (per l'istanza del codice vedere la cronologia delle revisioni)
Non ho molta familiarità con lo storyboard, ma so che puoi costruire la tua interfaccia in IB usando un .xib
file che è quasi identico all'uso della versione storyboard; Dovresti anche essere in grado di copiare e incollare le visualizzazioni nel loro insieme dall'interfaccia esistente al .xib
file.
Per testarlo ho creato un nuovo vuoto .xib
denominato "MyCustomTimerView.xib". Quindi ho aggiunto una vista e a quella ho aggiunto un'etichetta e due pulsanti. Così:
Ho creato una nuova sottoclasse di classe C dell'obiettivo UIView
denominata "MyCustomTimer". Nel mio .xib
ho impostato la classe Proprietario del mio file su MyCustomTimer . Ora sono libero di collegare azioni e punti vendita proprio come qualsiasi altra visualizzazione / controller. Il .h
file risultante ha questo aspetto:
@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
L'unico ostacolo rimasto per saltare è ottenere questo .xib
nella mia UIView
sottoclasse. L'uso di un .xib
riduce drasticamente la configurazione richiesta. E poiché stai usando gli storyboard per caricare i timer, sappiamo che -(id)initWithCoder:
è l'unico inizializzatore che verrà chiamato. Quindi ecco come appare il file di implementazione:
#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
Il metodo denominato loadNibNamed:owner:options:
fa esattamente quello che sembra. Carica il pennino e imposta la proprietà "File's Owner" su self. Estraiamo il primo oggetto nell'array e questa è la vista principale del pennino. Aggiungiamo la vista come una vista secondaria e Voilà è sullo schermo.
Ovviamente questo cambia solo il colore di sfondo dell'etichetta quando i pulsanti vengono premuti, ma questo esempio dovrebbe portarti sulla buona strada.
Note basate sui commenti:
Vale la pena notare che se stai ottenendo infiniti problemi di ricorsione probabilmente ti sei perso il sottile trucco di questa soluzione. Non sta facendo quello che pensi stia facendo. La vista inserita nello storyboard non viene visualizzata, ma carica invece un'altra vista come vista secondaria. Quella vista che carica è la vista definita nel pennino. Il "proprietario del file" nel pennino è quella vista invisibile. La parte interessante è che questa vista invisibile è ancora una classe Objective-C che può essere usata come una sorta di controller della vista per la vista che porta dal pennino. Ad esempio, i IBAction
metodi nella MyCustomTimer
classe sono qualcosa che ti aspetteresti di più in un controller di visualizzazione che in una visualizzazione.
Come nota a margine, alcuni potrebbero obiettare che questo si rompe MVC
e io sono in qualche modo d'accordo. Dal mio punto di vista è più strettamente correlato a una custom UITableViewCell
, che a volte deve anche essere in parte controller.
Vale anche la pena notare che questa risposta doveva fornire una soluzione molto specifica; creare un pennino che può essere istanziato più volte nella stessa vista come disposto su uno storyboard. Ad esempio, potresti facilmente immaginare sei di questi timer tutti su uno schermo di iPad contemporaneamente. Se hai solo bisogno di specificare una vista per un controller di visualizzazione che deve essere utilizzato più volte nella tua applicazione, la soluzione fornita da jyavenard a questa domanda è quasi certamente una soluzione migliore per te.