Kavramsal olarak cevaplamak gerekirse, zamanlayıcınız büyük olasılıkla UIView
yerine bir alt sınıf olmalıdır NSObject
.
Zamanlayıcınızın bir örneğini IB'de somutlaştırmak için, UIView
onu görüntü denetleyicinizin görünümüne sürükleyin ve sınıfını zamanlayıcınızın sınıf adına ayarlayın.
#import
Görünüm denetleyicinizde zamanlayıcı sınıfınızı unutmayın .
Düzenleme: IB tasarımı için (kod somutlaştırması için revizyon geçmişine bakın)
Film şeridine pek aşina değilim, ancak IB'de arayüzünüzü .xib
film şeridi sürümüyle neredeyse aynı olan bir dosya kullanarak oluşturabileceğinizi biliyorum ; Hatta görünümlerinizi bir bütün olarak mevcut arayüzünüzden .xib
dosyaya kopyalayıp yapıştırabilmelisiniz .
Bunu test etmek için .xib
"MyCustomTimerView.xib" adlı yeni bir boş yarattım . Sonra bir görünüm ekledim ve buna bir etiket ve iki düğme ekledim. Şöyle:
UIView
"MyCustomTimer" adında yeni bir hedef-C sınıfı alt sınıf oluşturdum . Benim dosyamın Owner sınıfını MyCustomTimer olarak.xib
ayarladım . Artık diğer herhangi bir görünüm / denetleyici gibi eylemleri ve çıkışları bağlamakta özgürüm. Ortaya çıkan dosya şuna benzer:.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
Atlamak için geriye kalan tek engel .xib
, bunu UIView
alt sınıfıma almak. Bir kullanmak .xib
, gerekli kurulumu önemli ölçüde azaltır. Ve zamanlayıcıları yüklemek için hikaye tahtaları kullandığınızdan -(id)initWithCoder:
, çağrılacak tek başlatıcı olduğunu biliyoruz . İşte uygulama dosyası şuna benziyor:
#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
Adlı yöntem loadNibNamed:owner:options:
, tam olarak göründüğü gibi yapar. Ucu yükler ve "File's Owner" özelliğini self olarak ayarlar. Dizideki ilk nesneyi çıkarıyoruz ve bu Nib'in kök görünümüdür. Görünümü bir alt görünüm olarak ekliyoruz ve Voila ekrana geliyor.
Açıkçası bu, düğmelere basıldığında etiketin arka plan rengini değiştirir, ancak bu örnek sizi yolunuza alacaktır.
Yorumlara dayalı notlar:
Sonsuz özyineleme problemleri yaşıyorsanız, muhtemelen bu çözümün ince hilesini kaçırmışsınızdır. Yaptığını düşündüğün şeyi yapmıyor. Film şeridine yerleştirilen görünüm görülmez, bunun yerine başka bir görünümü alt görünüm olarak yükler. Yüklediği görünüm, uçta tanımlanan görünümdür. Uçtaki "dosyanın sahibi" görünmeyen görünümdür. İşin güzel yanı, bu görünmeyen görünümün, uçtan getirdiği görünüm için bir çeşit görünüm denetleyicisi olarak kullanılabilen bir Objective-C sınıfı olmasıdır. Örneğin IBAction
, MyCustomTimer
sınıftaki yöntemler, bir görünümden çok bir görünüm denetleyicisinde beklediğiniz bir şeydir.
Bir yan not olarak, bazıları bunun kırıldığını iddia edebilir MVC
ve bir şekilde katılıyorum. Benim bakış açıma göre, bir gelenekle daha yakından ilişkili UITableViewCell
, ki bu da bazen parça kontrolörü olmak zorunda.
Bu cevabın çok özel bir çözüm sağlamak olduğunu da belirtmekte fayda var; bir film şeridinde düzenlendiği gibi aynı görünümde birden çok kez örneklenebilen bir uç oluşturun . Örneğin, bu zamanlayıcılardan altısının aynı anda bir iPad ekranında olduğunu kolayca hayal edebilirsiniz. Yalnızca uygulamanızda birden çok kez kullanılacak bir görünüm denetleyicisi için bir görünüm belirtmeniz gerekiyorsa, jyavenard tarafından bu soruya sağlanan çözüm kesinlikle sizin için daha iyi bir çözümdür.