2016-03-28 3 views
1

Ich versuche, etwas in meiner benutzerdefinierten Ansicht zu zeichnen, aber nicht sicher, warum DrawRect nicht auf seine Instanzdaten zugreifen konnte. Hier sind die Schritte, die ich versucht habe.Xcode os x: Warum DrawRect nicht auf Instanzdaten zugreifen konnte

  1. Erstellen Sie eine Mac OS X-App mit aktiviertem Storyboard.
  2. Löschen Sie im Storyboard die Ansicht, und fügen Sie an derselben Stelle eine neue benutzerdefinierte Ansicht unter der Ansicht hinzu. (Ich habe versucht, wenn die Ansicht nicht gelöscht wird, gleich).
  3. Weisen Sie der neu hinzugefügten benutzerdefinierten Ansicht die EEGView-Klasse zu.

dann ausführen. Anhand der Protokollinformationen werden Sie feststellen, dass drawRect nicht auf die Instanzdaten zugreifen konnte, obwohl die Instanzvariablen initialisiert und aktualisiert wurden.

In 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]; 
} 

In meiner benutzerdefinierten Ansicht Klasse 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 

Habe ich etwas verpasst? Getestet in Xcode 7.2 & 7.2. Aber wenn ich das "Using Storyboard" nicht aktiviere, funktioniert es.

Oder ist es ein Xcode Bug?

Jeder Ratschlag geschätzt. Vielen Dank im Voraus.

+0

kein Zusammenhang mit der Frage auf der Hand, aber wenn Sie erstellen Ein Timer mit 'planedTimerWithTimeInterval' muss nicht zusätzlich zur Run-Schleife hinzugefügt werden. Es ist bereits geplant. Wenn Sie den Timer mit 'timerWithTimeInterval' erstellt haben, fügen Sie ihn zu einer Ausführungsschleife hinzu, aber nicht, wenn Sie ihn bereits geplant haben. – Rob

+0

Danke. Ich habs. – iSleep

Antwort

0

Wenn Sie EEGView View auf Storyboard hinzugefügt haben, sollten Sie auch keine in viewDidLoad instanziieren. Du hast eine neue zugewiesen/initiert, aber es hat keine Beziehung zu der, die das Storyboard für dich erstellt hat. Die vom Storyboard erstellte Instanz wird also drawRect genannt, aber Sie legen die Eigenschaften in der separaten Instanz fest, die Sie in viewDidLoad erstellt haben und die nie zur Ansichtshierarchie hinzugefügt wurde (und daher nie drawRect aufgerufen wird).

Wenn das Storyboard die View-Controller-Ansicht instanziiert, instanziiert es Ihre EEGView für Sie. Alles, was Sie tun müssen, ist ein IBOutlet für diese Ansicht zu verbinden, um eine Referenz von Ihrem View-Controller zu erhalten. (Zum Beispiel können Sie Steuer zieht von EEGView in der Storyboard-Szene zum @interface für die View-Controller, die Sie schon im Assistenten-Editor nach oben gezogen.)

+0

Ja, Sie haben Recht. Vielen Dank! – iSleep

Verwandte Themen