Um konzeptionell zu antworten, sollte Ihr Timer wahrscheinlich eine Unterklasse von UIView
statt sein NSObject
.
Um eine Instanz Ihres Timers in IB zu instanziieren, ziehen Sie sie einfach UIView
in die Ansicht Ihres View Controllers und setzen Sie ihre Klasse auf den Klassennamen Ihres Timers.
Denken Sie an #import
Ihre Timer-Klasse in Ihrem View Controller.
Bearbeiten: für IB-Design (Code-Instanziierung siehe Revisionsverlauf)
Ich bin mit Storyboard überhaupt nicht sehr vertraut, aber ich weiß, dass Sie Ihre Schnittstelle in IB mithilfe einer .xib
Datei erstellen können, die fast identisch mit der Verwendung der Storyboard-Version ist. Sie sollten sogar in der Lage sein, Ihre Ansichten als Ganzes von Ihrer vorhandenen Oberfläche in die .xib
Datei zu kopieren und einzufügen .
Um dies zu testen, habe ich ein neues .xib
Leerzeichen mit dem Namen "MyCustomTimerView.xib" erstellt. Dann habe ich eine Ansicht hinzugefügt und dazu eine Beschriftung und zwei Schaltflächen hinzugefügt. Gefällt mir So:
Ich habe eine neue Ziel-C-Klasse-Unterklasse mit dem UIView
Namen "MyCustomTimer" erstellt. In meinem .xib
habe ich die Owner- Klasse meiner Datei auf MyCustomTimer festgelegt . Jetzt kann ich Aktionen und Ausgänge wie jede andere Ansicht / Steuerung verbinden. Die resultierende .h
Datei sieht folgendermaßen aus:
@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
Die einzige Hürde, die noch zu springen ist, besteht darin, dies .xib
in meine UIView
Unterklasse aufzunehmen. Durch die Verwendung eines .xib
wird das erforderliche Setup drastisch reduziert. Und da Sie Storyboards zum Laden der Timer verwenden, wissen wir, dass dies -(id)initWithCoder:
der einzige Initialisierer ist, der aufgerufen wird. So sieht die Implementierungsdatei aus:
#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
Die genannte Methode loadNibNamed:owner:options:
macht genau das, wonach es sich anhört. Es lädt die Schreibfeder und setzt die Eigenschaft "File's Owner" auf self. Wir extrahieren das erste Objekt im Array und das ist die Stammansicht der Feder. Wir fügen die Ansicht als Unteransicht hinzu und Voila wird auf dem Bildschirm angezeigt.
Natürlich ändert dies nur die Hintergrundfarbe des Etiketts, wenn die Tasten gedrückt werden, aber dieses Beispiel sollte Sie auf Ihrem Weg gut machen.
Anmerkungen basierend auf Kommentaren:
Es ist erwähnenswert, dass Sie bei unendlichen Rekursionsproblemen wahrscheinlich den subtilen Trick dieser Lösung verpasst haben. Es macht nicht das, was du denkst. Die Ansicht, die in das Storyboard eingefügt wird, wird nicht angezeigt, sondern lädt eine andere Ansicht als Unteransicht. Diese Ansicht, die es lädt, ist die Ansicht, die in der Feder definiert ist. Der "Eigentümer der Datei" in der Schreibfeder ist diese unsichtbare Ansicht. Der coole Teil ist, dass diese unsichtbare Ansicht immer noch eine Objective-C-Klasse ist, die als eine Art Ansichts-Controller für die Ansicht verwendet werden kann, die sie von der Schreibfeder einbringt. Zum Beispiel sind die IBAction
Methoden in der MyCustomTimer
Klasse etwas, das Sie in einem Ansichts-Controller mehr erwarten würden als in einer Ansicht.
Als Randnotiz können einige argumentieren, dass dies bricht MVC
und ich stimme etwas zu. Aus meiner Sicht ist es enger mit einem Brauch verbunden UITableViewCell
, der manchmal auch Teilesteuerung sein muss.
Es ist auch erwähnenswert, dass diese Antwort eine sehr spezifische Lösung bieten sollte; Erstellen Sie eine Feder, die in derselben Ansicht wie in einem Storyboard mehrfach instanziiert werden kann . Sie können sich beispielsweise leicht vorstellen, dass sechs dieser Timer gleichzeitig auf einem iPad-Bildschirm angezeigt werden. Wenn Sie nur eine Ansicht für einen Ansichtscontroller angeben müssen, der in Ihrer Anwendung mehrmals verwendet werden soll, ist die von jyavenard für diese Frage bereitgestellte Lösung mit ziemlicher Sicherheit eine bessere Lösung für Sie.