Xcode os x : 为什么 drawRect 无法访问实例数据

Xcode os x : Why drawRect could not access instance data

我正在尝试在我的自定义视图中绘制一些东西,但不确定为什么 drawRect 无法访问其实例数据。这是我尝试过的步骤。

  1. 创建一个 Mac OS X 应用程序,并选中使用故事板。
  2. 在故事板中,删除视图,然后在同一位置的视图下添加一个新的自定义视图。 (我试过如果视图没有被删除,一样)。
  3. 将 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 .)