当我尝试访问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 与普通方法不同,并且没有正确获取类的范围,但我该如何解决它?
干杯戴民
我有一种感觉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);