2

当我尝试访问 drawRect 方法中的类变量或属性时,我看到了一些奇怪的行为。

在我的 .h 文件中,我有以下内容

@interface DartBoard : UIView
{
    Board * board;
    int index;
}
@property (readwrite, assign, nonatomic) NSNumber * selectedIndex;
@end

在我的 .m 文件中,我有以下内容

@implementation DartBoard

@synthesize selectedIndex;

-(id)init
{
    self.selectedIndex = [NSNumber numberWithInt:5];
    index = 123;
    return self;
}

- (void)drawRect:(CGRect)rect {
    NSLog(@"selectedIndex: %d",[self.selectedIndex intValue]);
    NSLog(@"index: %d",index);
}

@end

输出是

2012-06-12 19:48:42.579 App [3690:707] selectedIndex: 0
2012-06-12 19:48:42.580 App [3690:707] index: 0

我一直在努力寻找解决方案,但没有运气..

我发现了一个类似的问题,但这个问题没有真正的答案

参见:UIView drawRect;类变量超出范围

我有一种感觉 drawRect 与普通方法不同,并且没有正确获得类的范围,但是我该如何解决呢?

干杯达米安

4

1 回答 1

5

我有一种感觉 drawRect 与普通方法不同,并且没有正确获得类的范围

不,没有什么特别的-drawRect:

有两种可能:

1.你的-init方法没有被调用。

你没有说这个视图是如何创建的——如果你是手动调用[[DartBoard alloc] init]的,或者它是从一个 nib 文件中取消归档的。

如果它来自笔尖,UIView则取消归档不知道init应该调用您的方法。它将改为调用指定的初始化程序,即-initWithFrame:.

因此,您应该改为实现该方法,并确保调用 super!

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self)
    {
        self.selectedIndex = [NSNumber numberWithInt:5];
        index = 123;
    }
    return self;
}

2. 您的视图可能有两个实例:一个是您手动init创建的,另一个来自其他地方,可能是一个笔尖。第二个实例是正在绘制的实例。由于它的变量和属性从未设置,因此它们显示为零(默认值)。

您可以将此行添加到您的-init-drawRect:方法中,以查看的值self是什么。(或者,使用调试器检查它。)

NSLog(@"self is %p", self);
于 2012-06-12T19:31:16.460 回答