所以假设我有两个视图,MyView
并且MySubview
,两个都是子类UIView
。
视图.h:
@interface MyView : UIView <ProgressCallback>
@property (retain, nonatomic) IBOutlet UIProgressBar *progress;
- (id) initWithFrame: (CGRect) frame;
- (void) progressUpdated: (NSNumber) newProgress;
@end
查看.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 子类的方法。它可以工作,我可以根据回调设置我的进度,它会出现等。我的问题是当我想子查看它时。
我的子视图.h
@interface MySubview : MyView
@property (retain, nonatomic) IBOutlet UIImageView *image;
@end
我的子视图.m
@implementation 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;
}
无论我如何初始化我的子类,我都无法让进度条在子类中工作。我可以在init的时候设置它,它不是nil,但它显然与我认为init之后的不对应。我认为这与我正在释放自我这一事实有关,但如果我想返回 View 类型的类,我看不到任何其他选择。我使用相同风格的 init,只是将类名更改为 Subview。回调实际上被调用并更改了代码,但它不会更新显示。笔尖中的所有东西都正确连接,除了大小之外,它们都是相同的,在这种情况下,还有图像。
(我尽力让示例代码尽可能简单明了。如果我没有成功,请告诉我,我会更新它。)
你如何正确地继承 UIView?我阅读了文档,没有任何启发,但请随时为我指明正确的方向。具体来说,我必须覆盖什么才能让所有内容都指向正确的项目?也就是说,显示器上的那些。