Um konzeptionell zu antworten, sollte Ihr Timer wahrscheinlich eine Unterklasse von UIViewstatt sein NSObject.
Um eine Instanz Ihres Timers in IB zu instanziieren, ziehen Sie sie einfach UIViewin die Ansicht Ihres View Controllers und setzen Sie ihre Klasse auf den Klassennamen Ihres Timers.

Denken Sie an #importIhre 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 .xibDatei 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 .xibDatei zu kopieren und einzufügen .
Um dies zu testen, habe ich ein neues .xibLeerzeichen 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 UIViewNamen "MyCustomTimer" erstellt. In meinem .xibhabe ich die Owner- Klasse meiner Datei auf MyCustomTimer festgelegt . Jetzt kann ich Aktionen und Ausgänge wie jede andere Ansicht / Steuerung verbinden. Die resultierende .hDatei 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 .xibin meine UIViewUnterklasse aufzunehmen. Durch die Verwendung eines .xibwird 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 IBActionMethoden in der MyCustomTimerKlasse etwas, das Sie in einem Ansichts-Controller mehr erwarten würden als in einer Ansicht.
Als Randnotiz können einige argumentieren, dass dies bricht MVCund 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.