继承UIView - 丢失实例变量

时间:2010-12-20 23:51:24

标签: iphone objective-c inheritance uiview

有点像Objective-C的新手,我已经四处寻找答案,但是如果这是一个明显的问题,我就无法找到答案,请原谅我。

基本上,我需要画一个圆的屏幕段(例如,一个90度的段,其中水平和垂直线在左下方相交,一个弧连接端点)。我设法在名为 CircleSegment 的自定义类中实现了这一功能,该类继承了UIView并覆盖了drawRect

我的问题是以编程方式实现这一目标;我需要一些方法来创建我的CircleSegment类并在其中存储所需的角度之前它绘制段本身。

这是我到目前为止所拥有的:

CircleSegment.h

#import <UIKit/UIKit.h>

@interface CircleSegment : UIView {
    float angleSize;
    UIColor *backColor;
}

-(float)convertDegToRad:(float)degrees;
-(float)convertRadToDeg:(float)radians;

@property (nonatomic) float angleSize;
@property (nonatomic, retain) UIColor *backColor;

@end

CircleSegment.m

#import "CircleSegment.h"


@implementation CircleSegment

@synthesize angleSize;
@synthesize backColor;


// INITIALISATION OVERRIDES
// ------------------------

- (id)initWithFrame:(CGRect)frame {
    if ((self = [super initWithFrame:frame])) {
        self.opaque = NO;
        self.backgroundColor = [UIColor clearColor];
    }
    return self;
}

- (void)setBackgroundColor:(UIColor *)newBGColor
{
    // Ignore.
}
- (void)setOpaque:(BOOL)newIsOpaque
{
    // Ignore.
}



// MATH FUNCTIONS
// --------------

// Converts degrees to radians.
-(float)convertDegToRad:(float)degrees {
    return degrees * M_PI / 180;    
}

// Converts radians to degrees.
-(float)convertRadToDeg:(float)radians {
    return radians * 180 / M_PI;
}


// DRAWING CODE
// ------------

- (void)drawRect:(CGRect)rect {

    float endAngle = 360 - angleSize;

    UIBezierPath* aPath = [UIBezierPath bezierPathWithArcCenter:CGPointMake(100, 100)
                                                         radius:100
                                                     startAngle:[self convertDegToRad:270]
                                                       endAngle:[self convertDegToRad:endAngle]
                                                      clockwise:YES];

    [aPath addLineToPoint:CGPointMake(100.0, 100.0)];

    [aPath closePath];

    CGContextRef aRef = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(aRef, backColor.CGColor);

    CGContextSaveGState(aRef);

    aPath.lineWidth = 1;

    [aPath fill];
    [aPath stroke];

    //CGContextRestoreGState(aRef);


}

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


@end

请注意,.m文件对于各种测试代码来说有点混乱......

所以基本上我想创建一个CircleSegment实例,在angleSize属性中存储一个角度,根据该角度绘制一个片段,然后将该视图添加到主应用视图中以显示它......

为了尝试实现这一点,我在ViewController上向viewDidLoad添加了以下测试代码:

CircleSegment *seg1 = [[CircleSegment alloc] init];
seg1.backColor = [UIColor greenColor];
seg1.angleSize = 10;

[self.view addSubview:seg1];

当我断开那些地方时似乎存储了UIColor和angleSize,但是如果我在drawRect放置一个断点,我在CircleSegment.m上覆盖了,那么这些值已经恢复为零值(或者无论如何正确的用语是,随意纠正我。)

如果有人能指出我正确的方向,我真的很感激!

由于

2 个答案:

答案 0 :(得分:0)

尝试在DrawRect方法中使用self.angleSize(与backColor相同)。在您的测试方法中,将10替换为10.0(以确保将其设置为浮点数)。

另外,不要忘记在dealloc中释放backColor。

答案 1 :(得分:0)

  

似乎存储了UIColor和   当我断点那些时,angleSize很好   但是,如果我放置一个地方   drawRect中的断点我   在CircleSegment.m上覆盖了   价值已经恢复为零   价值(或任何正确的术语   会随便纠正我。)

您确定使用的是同一个实例吗?

NSLog(@"%@ %p", NSStringFromSelector(_cmd), self);viewDidLoad中添加drawRect之类的内容,并确保您实际处理的是同一个实例。

(我见过开发人员将alloc/initWithFrame:视图然后使用在NIB加载期间创建的实例的情况,想知道为什么 实例未正确初始化。)