Nah untuk menjawab secara konseptual, pengatur waktu Anda kemungkinan besar harus menjadi subkelas, UIView
bukan NSObject
.
Untuk membuat instance dari UIView
pengatur waktu Anda di IB cukup seret dan letakkan di tampilan pengontrol tampilan Anda, dan setel kelasnya ke nama kelas pengatur waktu Anda.
Ingat #import
kelas pengatur waktu di pengontrol tampilan Anda.
Sunting: untuk desain IB (untuk contoh kode lihat riwayat revisi)
Saya sama sekali tidak begitu paham dengan storyboard, tetapi saya tahu bahwa Anda dapat membuat antarmuka Anda di IB menggunakan .xib
file yang hampir identik dengan versi storyboard; Anda bahkan harus dapat menyalin & menempel tampilan Anda secara keseluruhan dari antarmuka yang ada ke .xib
file.
Untuk menguji ini saya membuat kosong baru .xib
bernama "MyCustomTimerView.xib". Kemudian saya menambahkan tampilan, dan untuk itu menambahkan label dan dua tombol. Seperti Jadi:
Saya membuat subclassing kelas tujuan-C baru UIView
bernama "MyCustomTimer". Di kelas saya, .xib
saya menetapkan kelas Pemilik File menjadi MyCustomTimer . Sekarang saya bebas untuk menghubungkan tindakan dan outlet seperti tampilan / pengontrol lainnya. File yang dihasilkan .h
terlihat seperti ini:
@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
Satu-satunya rintangan yang tersisa untuk dilompati adalah mendapatkan ini .xib
di UIView
subkelas saya . Menggunakan secara .xib
dramatis mengurangi pengaturan yang diperlukan. Dan karena Anda menggunakan papan cerita untuk memuat pengatur waktu, kami tahu -(id)initWithCoder:
bahwa satu-satunya penginisialisasi yang akan dipanggil. Jadi seperti inilah file implementasinya:
#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
Metode bernama loadNibNamed:owner:options:
melakukan persis seperti namanya. Ini memuat Nib dan menetapkan properti "Pemilik File" ke dirinya sendiri. Kami mengekstrak objek pertama dalam array dan itu adalah tampilan root dari Nib. Kami menambahkan tampilan sebagai subview dan Voila itu di layar.
Jelas ini hanya mengubah warna latar belakang label saat tombol ditekan, tetapi contoh ini akan membantu Anda.
Catatan berdasarkan komentar:
Perlu dicatat bahwa jika Anda mendapatkan masalah rekursi tak terbatas, Anda mungkin melewatkan trik halus dari solusi ini. Itu tidak melakukan apa yang Anda pikir dilakukannya. Tampilan yang diletakkan di storyboard tidak terlihat, melainkan memuat tampilan lain sebagai subview. Tampilan yang dimuatnya adalah tampilan yang ditentukan di ujung pena. "Pemilik file" di ujung pena adalah tampilan yang tak terlihat itu. Bagian yang keren adalah bahwa tampilan tak terlihat ini masih merupakan kelas Objective-C yang dapat digunakan sebagai semacam pengontrol tampilan untuk tampilan yang dibawa dari ujung pena. Misalnya, IBAction
metode di MyCustomTimer
kelas adalah sesuatu yang Anda harapkan lebih banyak di pengontrol tampilan daripada di tampilan.
Sebagai catatan tambahan, beberapa orang mungkin berpendapat bahwa ini rusak MVC
dan saya agak setuju. Dari sudut pandang saya, ini lebih terkait dengan kebiasaan UITableViewCell
, yang terkadang juga harus menjadi pengontrol bagian.
Perlu juga dicatat bahwa jawaban ini memberikan solusi yang sangat spesifik; buat satu ujung yang bisa dibuat instance-nya beberapa kali pada tampilan yang sama seperti yang ditata di papan cerita. Misalnya, Anda dapat dengan mudah membayangkan enam dari pengatur waktu ini semuanya di layar iPad sekaligus. Jika Anda hanya perlu menentukan tampilan untuk pengontrol tampilan yang akan digunakan beberapa kali di seluruh aplikasi Anda, maka solusi yang diberikan oleh jyavenard untuk pertanyaan ini hampir pasti merupakan solusi yang lebih baik untuk Anda.