[解決済み] iOSのカスタムビュークラスを作成し、その複数のコピーを(IBで)インスタンス化するにはどうすればよいですか?
質問内容
現在、複数のタイマーを持つアプリを作っているのですが、基本的にどれも同じようなものです。
私は、タイマーのすべてのコードとレイアウト/アニメーションを使用するカスタム クラスを作成したいと思います。
私は IB (xcode 4.2) を使用してレイアウトを作成し、タイマーのすべてのコードは現在 viewcontroller クラスにのみあります。
私は、カスタムクラスにすべてをカプセル化し、それをビューコントローラに追加する方法について、私の脳を包むのに苦労しています。
どのように解決するのですか?
概念的にお答えすると、タイマはおそらく
UIView
のサブクラスで、代わりに
NSObject
.
IBでタイマーのインスタンスを生成するには、単に
UIView
をドラッグしてビューコントローラーのビューにドロップし、 そのクラスをタイマーのクラス名に設定します。
を忘れないでください。
#import
を追加してください。
編集:IB設計のため(コードのインスタンス化については改訂履歴を参照)
私はstoryboardにはあまり詳しくないのですが、IBでインターフェイスを構築する際に
.xib
ファイルを使って、IBでインターフェイスを構築することができることは知っています。
.xib
ファイルにコピー&ペーストすることもできるはずです。
これをテストするために、新しい空の
.xib
という名前の新しい空の
をサブクラスとする新しい objective-C クラスを作成しました。
UIView
MyCustomTimer"と名付けました。私の
.xib
に
ファイルの所有者
クラスを
マイカスタムタイマー
. これで、他のビュー/コントローラと同じように、アクションとアウトレットを自由に接続できるようになりました。その結果
.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 をロードして、"File's Owner" プロパティを self に設定します。配列の最初のオブジェクトを抽出し、それが Nib のルート ビューになります。このビューをサブビューとして追加すると、画面上に表示されます。
もちろん、これはボタンが押されたときにラベルの背景色を変更するだけですが、この例で十分に理解できるはずです。
コメントによるメモ。
もしあなたが無限再帰の問題を抱えているならば、おそらくこの解決策の微妙なトリックを見逃すことになる、ということは注目に値します。それは、あなたが考えているようなことを行っているわけではありません。ストーリーボードに配置されたビューは見られず、代わりにサブビューとして別のビューがロードされます。読み込まれるビューは、nibで定義されているビューです。nibの中のquot;file's owner"は、その見えないビューです。この未公開ビューは、Objective-Cのクラスであり、nibから読み込んだビューのコントローラーのようなものとして使用することができます。例えば
IBAction
のメソッドは
MyCustomTimer
クラスのメソッドは、ビューよりもビューコントローラに期待されるものです。
余談ですが、これによって
MVC
を壊していると主張する人がいるかもしれませんが、私も多少は同意します。私の観点では、これはより密接にカスタム
UITableViewCell
に近いもので、これも時にはパートコントローラである必要があります。
この回答は、非常に具体的な解決策を提供するものであったことも特筆すべきです。 同じ意見 のように、ストーリーボードにレイアウトされます。例えば、6つのタイマーをiPadの画面上に一度に表示することは容易に想像がつくでしょう。もし、アプリケーション全体で複数回使用されるビューコントローラのビューを指定するだけなら この質問に対してjyavenardが提供した解決策 があなたにとってより良い解決策であることはほぼ間違いないでしょう。
関連
-
[解決済み] 文字列の長さを取得する
-
[解決済み] 奇妙な不要なXcodeログを隠す
-
[解決済み] iPhone UITextField - プレースホルダーの文字色を変更する
-
[解決済み] iOSで画面の幅と高さを取得する方法は?
-
[解決済み] SwiftでURLから画像を読み込む/ダウンロードする
-
[解決済み] iOS 7でステータスバーとナビゲーションバーがビューの境界を越えて表示される
-
[解決済み] NSNotificationCenterのaddObserver in Swift
-
[解決済み] Swiftのプロトコルでオプションのメソッドを定義するには?
-
[解決済み】iOSで最上位のビューコントローラーを見つける方法
-
[解決済み】NSUserDefaultsにカスタムオブジェクトを格納する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Xcode - 'NSUnknownKeyException', reason: ... this class is not key value coding-compliant for the key X" エラーの修正方法とは?
-
XCode のコンパイル例外を解決する clang: error: linker command failed with exit code 1
-
[解決済み] UITextViewのプレースホルダー
-
[解決済み] UITextFieldのテキスト変更イベント
-
[解決済み] UITableViewCell、スワイプ時に削除ボタンを表示させる
-
[解決済み] SwiftでUIAlertViewを作成するにはどうしたらいいですか?
-
[解決済み] iOS Simulatorでネットワークを無効にすることは可能ですか?
-
[解決済み] iphoneアプリのベータテストはどのように行うのですか?
-
[解決済み] Swift で HTTP リクエストを行うにはどうしたらいいですか?
-
[解決済み] Storyboardで外部xibファイルからビューを読み込む