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
- Erstellen Sie eine Mac OS X-App mit aktiviertem Storyboard.
- 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).
- 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.
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
Danke. Ich habs. – iSleep