Xcode os x : 为什么 drawRect 无法访问实例数据
Xcode os x : Why drawRect could not access instance data
我正在尝试在我的自定义视图中绘制一些东西,但不确定为什么 drawRect 无法访问其实例数据。这是我尝试过的步骤。
- 创建一个 Mac OS X 应用程序,并选中使用故事板。
- 在故事板中,删除视图,然后在同一位置的视图下添加一个新的自定义视图。 (我试过如果视图没有被删除,一样)。
- 将 EEGView class 分配给新添加的自定义视图。
然后 运行。从日志信息中,您会注意到尽管实例变量已初始化和更新,但 drawRect 无法访问实例数据。
在viewCtroller.m
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
myView = [[EEGView alloc] init];
//[self.view addSubview:myView];
//Start Timer in 3 seconds to show the result.
NSTimer* _timerAppStart = [NSTimer scheduledTimerWithTimeInterval:2
target:self
selector:@selector(UpdateEEGData)
userInfo:nil
repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:_timerAppStart forMode:NSDefaultRunLoopMode];
}
- (void)UpdateEEGData
{
// NSLog(@"UpdateEEGData.....1");
// myView.aaa = 200;
// myView.nnn = [NSNumber numberWithInteger:myView.aaa];
// make sure this runs on the main thread
if (![NSThread isMainThread]) {
// NSLog(@"NOT in Main thread!");
[self performSelectorOnMainThread:@selector(updateDisplay) withObject:nil waitUntilDone:TRUE];
}else
{
[self.view setNeedsDisplay:YES];
}
NSLog(@"UpdateEEGData.....2");
[myView setAaa:400];
myView.nnn = [NSNumber numberWithInteger:myView.aaa];
// make sure this runs on the main thread
if (![NSThread isMainThread]) {
// NSLog(@"NOT in Main thread!");
[self performSelectorOnMainThread:@selector(updateDisplay) withObject:nil waitUntilDone:TRUE];
}else
{
[self.view setNeedsDisplay:YES];
}
}
-(void)updateDisplay
{
[self.view setNeedsDisplay:YES];
}
在我的自定义视图中 class EEGView.m
@implementation EEGView
@synthesize aaa;
@synthesize nnn;
-(id)init{
self = [super init];
if (self) {
aaa = 10;
nnn = [NSNumber numberWithInteger:aaa];
NSLog(@"init aaa: %i", aaa);
NSLog(@"init nnn: %i", [nnn intValue]);
}
return self;
}
- (void)drawRect:(NSRect)dirtyRect {
[super drawRect:dirtyRect];
// Drawing code here.
NSLog(@"drawRect is here");
NSLog(@"drawRect aaa: %i", aaa);
NSLog(@"drawRect nnn: %i", [nnn intValue]);
}
@end
我错过了什么吗?在 Xcode 7.2 和 7.2 中测试。但是,如果我不选中 'using storyboard',它就会起作用。
还是 Xcode 错误?
任何建议表示赞赏。
提前致谢。
如果您在故事板上添加了 EEGView
视图,则不应在 viewDidLoad
中也实例化一个视图。您 alloc/init 创建了一个新的,但它与故事板为您创建的那个没有任何关系。因此,故事板创建的那个调用了 drawRect
,但是您在 viewDidLoad
中创建的单独实例中设置了属性,该实例从未添加到视图层次结构中(因此永远不会有它的 drawRect
称为)。
当故事板实例化视图控制器的视图时,它会为您实例化您的 EEGView
。您需要做的就是为该视图连接一个 IBOutlet
以便从您的视图控制器获取对它的引用。 (例如,您可以 control 从故事板场景中的 EEGView
拖动到您在辅助编辑器中拉出的视图控制器的 @interface
.)
我正在尝试在我的自定义视图中绘制一些东西,但不确定为什么 drawRect 无法访问其实例数据。这是我尝试过的步骤。
- 创建一个 Mac OS X 应用程序,并选中使用故事板。
- 在故事板中,删除视图,然后在同一位置的视图下添加一个新的自定义视图。 (我试过如果视图没有被删除,一样)。
- 将 EEGView class 分配给新添加的自定义视图。
然后 运行。从日志信息中,您会注意到尽管实例变量已初始化和更新,但 drawRect 无法访问实例数据。
在viewCtroller.m
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
myView = [[EEGView alloc] init];
//[self.view addSubview:myView];
//Start Timer in 3 seconds to show the result.
NSTimer* _timerAppStart = [NSTimer scheduledTimerWithTimeInterval:2
target:self
selector:@selector(UpdateEEGData)
userInfo:nil
repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:_timerAppStart forMode:NSDefaultRunLoopMode];
}
- (void)UpdateEEGData
{
// NSLog(@"UpdateEEGData.....1");
// myView.aaa = 200;
// myView.nnn = [NSNumber numberWithInteger:myView.aaa];
// make sure this runs on the main thread
if (![NSThread isMainThread]) {
// NSLog(@"NOT in Main thread!");
[self performSelectorOnMainThread:@selector(updateDisplay) withObject:nil waitUntilDone:TRUE];
}else
{
[self.view setNeedsDisplay:YES];
}
NSLog(@"UpdateEEGData.....2");
[myView setAaa:400];
myView.nnn = [NSNumber numberWithInteger:myView.aaa];
// make sure this runs on the main thread
if (![NSThread isMainThread]) {
// NSLog(@"NOT in Main thread!");
[self performSelectorOnMainThread:@selector(updateDisplay) withObject:nil waitUntilDone:TRUE];
}else
{
[self.view setNeedsDisplay:YES];
}
}
-(void)updateDisplay
{
[self.view setNeedsDisplay:YES];
}
在我的自定义视图中 class EEGView.m
@implementation EEGView
@synthesize aaa;
@synthesize nnn;
-(id)init{
self = [super init];
if (self) {
aaa = 10;
nnn = [NSNumber numberWithInteger:aaa];
NSLog(@"init aaa: %i", aaa);
NSLog(@"init nnn: %i", [nnn intValue]);
}
return self;
}
- (void)drawRect:(NSRect)dirtyRect {
[super drawRect:dirtyRect];
// Drawing code here.
NSLog(@"drawRect is here");
NSLog(@"drawRect aaa: %i", aaa);
NSLog(@"drawRect nnn: %i", [nnn intValue]);
}
@end
我错过了什么吗?在 Xcode 7.2 和 7.2 中测试。但是,如果我不选中 'using storyboard',它就会起作用。
还是 Xcode 错误?
任何建议表示赞赏。 提前致谢。
如果您在故事板上添加了 EEGView
视图,则不应在 viewDidLoad
中也实例化一个视图。您 alloc/init 创建了一个新的,但它与故事板为您创建的那个没有任何关系。因此,故事板创建的那个调用了 drawRect
,但是您在 viewDidLoad
中创建的单独实例中设置了属性,该实例从未添加到视图层次结构中(因此永远不会有它的 drawRect
称为)。
当故事板实例化视图控制器的视图时,它会为您实例化您的 EEGView
。您需要做的就是为该视图连接一个 IBOutlet
以便从您的视图控制器获取对它的引用。 (例如,您可以 control 从故事板场景中的 EEGView
拖动到您在辅助编辑器中拉出的视图控制器的 @interface
.)