Eh bien, pour répondre conceptuellement, votre minuterie devrait probablement être une sous-classe de UIView
au lieu de NSObject
.
Pour instancier une instance de votre minuterie dans IB, faites-la simplement glisser et UIView
déposez-la sur la vue de votre contrôleur de vue et définissez sa classe sur le nom de classe de votre minuterie.
N'oubliez pas #import
votre classe de minuterie dans votre contrôleur de vue.
Edit: pour la conception IB (pour l'instanciation du code, voir l'historique des révisions)
Je ne suis pas du tout familier avec le storyboard, mais je sais que vous pouvez construire votre interface dans IB en utilisant un .xib
fichier qui est presque identique à l'utilisation de la version du storyboard; Vous devriez même pouvoir copier et coller vos vues dans leur ensemble depuis votre interface existante vers le .xib
fichier.
Pour tester cela, j'ai créé un nouveau vide .xib
nommé "MyCustomTimerView.xib". Ensuite, j'ai ajouté une vue, et à cela j'ai ajouté une étiquette et deux boutons. Ainsi:
J'ai créé une nouvelle sous-classe de classe objective-C UIView
nommée "MyCustomTimer". Dans mon, .xib
j'ai défini la classe Propriétaire de mon fichier sur MyCustomTimer . Maintenant, je suis libre de connecter des actions et des prises comme n'importe quelle autre vue / contrôleur. Le .h
fichier résultant ressemble à ceci:
@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
Le seul obstacle qui reste à sauter est d'obtenir cela .xib
sur ma UIView
sous - classe. L'utilisation d'un .xib
réduit considérablement la configuration requise. Et puisque vous utilisez des storyboards pour charger les minuteries, nous savons que -(id)initWithCoder:
c'est le seul initialiseur qui sera appelé. Voici donc à quoi ressemble le fichier d'implémentation:
#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
La méthode nommée loadNibNamed:owner:options:
fait exactement ce qu'elle ressemble. Il charge le Nib et définit la propriété "File's Owner" sur self. Nous extrayons le premier objet du tableau et c'est la vue racine du Nib. Nous ajoutons la vue en tant que sous-vue et voilà, c'est à l'écran.
Évidemment, cela ne fait que changer la couleur d'arrière-plan de l'étiquette lorsque vous appuyez sur les boutons, mais cet exemple devrait vous aider à bien démarrer.
Notes basées sur des commentaires:
Il est à noter que si vous rencontrez des problèmes de récursions infinis, vous avez probablement raté l'astuce subtile de cette solution. Il ne fait pas ce que vous pensez faire. La vue placée dans le storyboard n'est pas vue, mais charge une autre vue en tant que sous-vue. Cette vue qu'il charge est la vue qui est définie dans la pointe. Le "propriétaire du fichier" dans la pointe est cette vue invisible. Ce qui est cool, c'est que cette vue invisible est toujours une classe Objective-C qui peut être utilisée comme une sorte de contrôleur de vue pour la vue qu'elle apporte depuis la pointe. Par exemple, les IBAction
méthodes de la MyCustomTimer
classe sont quelque chose que vous attendez plus dans un contrôleur de vue que dans une vue.
En passant, certains peuvent soutenir que cela rompt MVC
et je suis quelque peu d'accord. De mon point de vue, c'est plus étroitement lié à une coutume UITableViewCell
, qui doit aussi parfois faire partie du contrôleur.
Il convient également de noter que cette réponse était de fournir une solution très spécifique; créez une pointe qui peut être instanciée plusieurs fois sur la même vue que celle présentée sur un storyboard. Par exemple, vous pouvez facilement imaginer six de ces minuteries sur un écran iPad à la fois. Si vous avez seulement besoin de spécifier une vue pour un contrôleur de vue qui doit être utilisé plusieurs fois dans votre application, la solution fournie par jyavenard à cette question est presque certainement une meilleure solution pour vous.