子类化自定义UIView - 如何初始化

时间:2012-08-12 13:01:00

标签: objective-c ios uiview

因此,假设我有两个观点,MyViewMySubview,两个观点都属于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的docs和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期间设置它,它不是nil,但它显然不符合init之后我视图中的那个。我认为这与我释放自我的事实有关,但如果我想返回一个类型为View的类,我看不到任何其他选择。我使用相同的init样式,只是将类名更改为Subview。实际上调用了回调并更改了代码,但它没有更新显示。所有东西都正确地连接在笔尖上,除了尺寸外,它们是相同的,在这种情况下,还有图像。

(我尽力使示例代码尽可能简单明了。如果我没有成功,请告诉我,我会更新它。)

你如何正确地继承UIView?我阅读了文档,没有任何证据具有启发性,但请随意指出我正确的方向。具体来说,我必须覆盖哪些东西指向正确的项目?也就是显示屏上的那些。

2 个答案:

答案 0 :(得分:0)

initWithFrame:方法中调用initWithLabel:andWithFrame:

后,你压倒了自我的价值

这一行:

self = newView;

覆盖在MyView超类init方法中创建的self值,因此您将丢失所有自定义

答案 1 :(得分:0)

如果你也有这个问题,你可能做错了,因为我是。

一般而言:

如果您正在处理内容,请覆盖UIViewController

如果您正在搞乱几何图形,请覆盖UIView

这解决了我的问题,虽然技术上我的代码出了什么问题是wattson12所说的。