子类定制UIView - 如何初始化
因此,假设我有两个视图,MyView
和MySubview
,这两个视图的子类都是UIView
。子类定制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!
}
我发现通过浏览苹果的文档和StackOverflow上创建的UIView的子类的这个方法。它的工作原理,我可以根据回调来设置我的进度,它会出现,等等。我的问题是当我想子视图。
MySubview.h
@interface MySubview : MyView
@property (retain, nonatomic) IBOutlet UIImageView *image;
@end
MySubview.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中设置它,但它不是零,但它显然不对应于init后的视图中的那个。我认为这与我释放自己的事实有关,但是如果我想返回一个类型为View的类,则看不到其他选择。我使用相同样式的init,只是将类名更改为Subview。回调实际上被调用并且在代码中改变,但它不更新显示。所有东西都正确地连接在笔尖上,除了尺寸以外,它们是相同的,在这种情况下,它们与图像相同。
(我尽量使示例代码简单,并尽可能清楚。如果我没有成功,请让我知道,我会更新它。)
你如何正确子类的UIView ?我阅读了文档,没有任何证据可以启发,但请随时指出我的方向。具体而言,我必须重写什么才能让所有内容指向正确的项目?也就是显示器上的那些。
您在initWithLabel:andWithFrame:
方法调用initWithFrame:
后覆盖自我价值
这一行:
self = newView;
覆盖这是在MyView的超init方法创建的自我价值,所以你失去所有定制你有
如果你也有这个问题,你可能做错了,因为我是。
一般:
如果您与内容搞乱,覆盖UIViewController
。
如果您正在搞乱几何,请覆盖UIView
。
这解决了我的问题,虽然技术上我的代码有什么问题是wattson12说的。
可可触摸与可可不一样,所以这个问题不应该相应地编辑。 – 2012-08-12 13:26:53
self = newView;这不会破坏继承。如果您以后想要子类MySubview,您的初始化程序将returen MySubview类而不是您要创建的新类。 – 2016-03-09 11:28:14