概念的に答えると、タイマーはのサブクラスである可能性がUIView
ありNSObject
ます。
タイマーのインスタンスをIBでインスタンス化するUIView
には、ビューコントローラーのビューにドロップしてドロップし、そのクラスをタイマーのクラス名に設定します。
#import
ビューコントローラーのタイマークラスを忘れないでください。
編集:IB設計用(コードのインスタンス化については改訂履歴を参照)
私はストーリーボードについてはあまり詳しくありませんが.xib
、ストーリーボードバージョンを使用するのとほぼ同じファイルを使用してIBでインターフェイスを構築できることは知っています。ビュー全体を既存のインターフェイスから.xib
ファイルにコピーして貼り付けることもできます。
これをテストするために、.xib
「MyCustomTimerView.xib」という名前の新しい空を作成しました。次に、ビューを追加し、それにラベルと2つのボタンを追加しました。そのようです:
UIView
「MyCustomTimer」という名前の新しいObjective-Cクラスサブクラスを作成しました。私.xib
では、ファイルの所有者クラスをMyCustomTimerに設定しました。これで、他のビュー/コントローラーと同じように、アクションとアウトレットを自由に接続できます。結果の.h
ファイルは次のようになります。
@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
ジャンプするために残っている唯一のハードルは、これ.xib
を私のUIView
サブクラスで取得することです。.xib
劇的に使用すると、必要なセットアップが削減されます。また、ストーリーボードを使用してタイマーをロードしている-(id)initWithCoder:
ので、呼び出されるイニシャライザが唯一であることはわかっています。実装ファイルは次のようになります。
#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
名前の付いたメソッドloadNibNamed:owner:options:
は、実際の動作とまったく同じです。Nibをロードし、「ファイルの所有者」プロパティをselfに設定します。配列の最初のオブジェクトを抽出します。これは、ニブのルートビューです。ビューをサブビューとして追加し、画面に表示します。
明らかに、これはボタンが押されたときにラベルの背景色を変更するだけですが、この例ではうまくいくはずです。
コメントに基づくメモ:
無限再帰の問題が発生している場合は、このソリューションの微妙なトリックを見逃している可能性があります。それはあなたが思っていることをやっていない。ストーリーボードに配置されたビューは表示されませんが、代わりに別のビューをサブビューとしてロードします。ロードするビューは、ペン先で定義されているビューです。nibの「ファイルの所有者」は、その目に見えないビューです。クールな部分は、この見えないビューが依然としてObjective-Cクラスであり、ペン先から取り込むビューの一種のビューコントローラーとして使用できることです。たとえばIBAction
、MyCustomTimer
クラスのメソッドは、ビューよりもビューコントローラーで期待されるものです。
余談ですが、これはうまく機能しないと主張する人もいるでしょうMVC
。私の観点から見るとUITableViewCell
、これはカスタムとより密接に関連しており、カスタムパーツである場合もあります。
また、この回答は非常に具体的なソリューションを提供するためのものだったことにも注意してください。ストーリーボードにレイアウトされた同じビューで複数回インスタンス化できる1つのペン先を作成します。たとえば、iPadの画面上でこれらのタイマーのうち6つを一度に簡単に想像することができます。アプリケーション全体で複数回使用されるビューコントローラーのビューを指定する必要があるだけの場合、この質問に対してjyavenardが提供するソリューションは、ほとんどの場合、より良いソリューションです。