MyView
では、 と の 2 つのビューがありMySubview
、どちらも がサブクラスであるとしましょうUIView
。
View.h:
@interface MyView : UIView <ProgressCallback>
@property (retain, nonatomic) IBOutlet UIProgressBar *progress;
- (id) initWithFrame: (CGRect) frame;
- (void) progressUpdated: (NSNumber) newProgress;
@end
View.m
@implementation MyView
@synthesize progress = _progress;
- (id)initWithFrame:(CGRect)frame;
{
self = [super initWithFrame:frame];
if (self){
NSArray *arrayOfViews = [[NSBundle mainBundle] loadNibNamed:@"MyViewNibFile"
owner:nil
options:nil];
if ([arrayOfViews count] < 1){
[self release];
return nil;
}
View *newView = [[arrayOfViews objectAtIndex:0] retain];
[newView setFrame:frame];
[self release];
self = newView;
self.progress.progress = .25 // This will work and change it.
}
return self;
}
- (void) progressUpdated: (NSNumber) newProgress {
self.progress.progress = newProgress.floatValue; // This also works!
}
AppleのドキュメントとStackOverflowを参照して、UIViewのサブクラスを作成するこの方法を見つけました。それは機能し、コールバックに基づいて進行状況を設定でき、表示されます。私の問題は、これをサブビューしたいときです。
MySubview.h
@interface MySubview : MyView
@property (retain, nonatomic) IBOutlet UIImageView *image;
@end
MySubview.m
@実装 MySubview
- (id)initWithLabel: (UIImageView *) image andWithFrame:(CGRect)frame;
{
self = [super initWithFrame:frame];
if (self){
NSArray *arrayOfViews = [[NSBundle mainBundle] loadNibNamed:@"MySubViewNibFile"
owner:nil
options:nil];
if ([arrayOfViews count] < 1){
[self release];
return nil;
}
MySubbiew *newView = [[arrayOfViews objectAtIndex:0] retain];
[newView setFrame:frame];
[self release];
self = newView;
self.progress.progress = .25 // This will work and change it.
self.image = image; // Also works
}
return self;
}
サブクラスをどのように初期化しても、サブクラスで進行状況バーが機能しません。初期化中に設定できますが、ゼロではありませんが、初期化後の私の見解とは明らかに一致しません。私は自分自身を解放しているという事実に関係していると思いますが、タイプ View のクラスを返したい場合、他の選択肢はありません。クラス名を Subview に変更するだけで、同じスタイルの init を使用します。コールバックが実際に呼び出され、コードが変更されますが、表示は更新されません。すべてがペン先に正しく接続されており、サイズを除いて同一であり、この場合は画像があります。
(サンプル コードをできる限りシンプルかつ明確にするために最善を尽くしました。成功しなかった場合はお知らせください。更新します。)
UIViewを適切にサブクラス化するにはどうすればよいですか? 私はドキュメントを読みましたが、何も啓発的ではありませんでしたが、お気軽に正しい方向に向けてください。具体的には、すべてが正しいアイテムを指すようにするには、何をオーバーライドする必要がありますか? つまり、ディスプレイ上のものです。