如何分配initWithCoder或initWithFrame

时间:2011-11-09 17:14:49

标签: objective-c cocoa

    #import "DotAnimation.h"


@implementation DotAnimation
DoodlePad* dp;

-(void)setupView {
    Ball = CGRectMake(10, 10, 10, 10);
    [NSTimer scheduledTimerWithTimeInterval:(1.0f / 30.0f) target:self selector:@selector(traceBall) userInfo:nil repeats:YES];
}

-(id)initWithCoder:(NSCoder *)aDecoder {
    if (self == [super initWithCoder:aDecoder]){
        [self setupView];
    }
    return self;
}

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [self setupView];
    }
    return self;
}


/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.*/
- (void)drawRect:(CGRect)rect {
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(context, [[UIColor yellowColor] CGColor]);
    CGContextFillEllipseInRect(context, Ball);

}
-(void)traceBall{
    vector<CGPoint>::iterator L = dp.doodlePoints->begin();
    while(L != dp.doodlePoints->end()){
        Ball.origin.x += (*L).x;
        Ball.origin.y += (*L).y;
        ++L;
    }
    [self setNeedsDisplay];
}

- (void)dealloc
{
    [super dealloc];
}

@end

我有这个动画我试图在另一个文件中使用。 所以我想我做的事情

trace = [[DotAnimation alloc]initWithCoder];

trace = [[DotAnimation alloc]initWithFrame];

我不确定使用哪一个,或者我是否正确地写这个。

我希望能够使用:

    while(k != dp.doodlePoints->end()){
    Ball.origin.x += (*k).x;
    Ball.origin.y += (*k).y;
    ++k;
}

在另一个文件中,但我不知道如何从DotAnimation调用Ball.origin

如果你能把我与关于理解这一点的好信息联系起来,那也很棒。

2 个答案:

答案 0 :(得分:14)

将对象嵌入XIB时,框架会调用

initWithCoder。就像ViewController一样。所以你不应该自己打电话。

如果你想设置框架,那么调用initWithFrame可能是一个更好的解决方案(就像在这里做的那样)。但是你可以给一个框架,并添加一个你自己创建的子视图。

如果您不想自己创建子视图,那么您可以调用/覆盖它的initWithNibName:bundle:。创建包含视图的XIB。但是您仍然需要将该视图作为子视图添加到显示动画视图的主视图中。

答案 1 :(得分:2)

initWithCoder:是您从归档中恢复时自称的内容;它不适合看似对象的东西。由于它仅用于简单的设置代码,您可以将其删除。

此外,通过从另一个对象更改“Ball”对象来制作动画与Cocoa视图编程并不完全一致。您应该查看文档中的“Cocoa编程指南简介”,并从那里开始工作。