2012-12-17 11 views
7

Widziałem wiele wątków związanych z tym problemem, ale żaden nie dotyczy mojej sprawy (chyba).SetNeedsDisplay nie działa

Mój przypadek powinien być prosty, mam Custom UIView w moim kontrolerze, od kontrolera używam [self.myView setNeedsDisplay] i działa idealnie.

Mam problemy, gdy próbuję wywołać to z wewnątrz samego UIView ... Mam powiadomienie wysyłane z innej klasy i jest odbierane przez mój widok (działa) z informacją, że przekazuje, aktualizuję wewnętrzne właściwości tego widoku i dzwonię do [self setNeedsDisplay], który chce zaktualizować mój ekran o nowe stany, ale nic się nie dzieje, użyłem NSLOG w mojej metodzie i nie jest to Wywoływany w tym momencie, jest wywoływany tylko wtedy, gdy moja klasa kontrolera wywołuje setNeedsDisplay, a kiedy tak się stanie, aktualizacja, która powinna się wydarzyć wcześniej, jest pokazana na ekranie ... Nie wiem, dlaczego jej nie aktualizowanie przed ...

Oto niektóre kodu:

mojego kontrolera z prośbą o aktualizację: (! Działa OK)

- (void)addNodeToNetwork:(DTINode *)node 
{ 
[self.myNetwork addNodeInTheNetwork:node]; 
self.gridView.nodesToDraw = [self.myNetwork.nodesInNetwork copy]; 

CGRect tempRec = CGRectMake(node.nodePosition.x, node.nodePosition.y node.nodePosition.x, node.nodePosition.y); 
NSValue *rectObj = [NSValue valueWithCGRect:tempRec]; //transforma o cgrect num objeto 

[self.gridView.fatherNodes setValue:rectObj forKey:node.nodeName]; 
[self.gridView setNeedsDisplay]; 
} 

Moja metoda powiadomienie próbuje aktualizować mój rysunek: (nie działa!)

- (void) receiveTestNotification:(NSNotification *) notification 
{ 
NSDictionary *userInfo = notification.userInfo; 
DTINode *notificationNode = [userInfo objectForKey:@"myNode"]; 
NSLog(@"Im Here!"); 
for (DTINode *node in self.nodesToDraw) 
{ 
    NSLog(@"Here too"); 

    if(node.nodeName == notificationNode.fatherNode) 
    { 
     CGRect temp = CGRectMake(notificationNode.nodePosition.x, notificationNode.nodePosition.y, node.nodePosition.x, node.nodePosition.y); 
     NSValue *tempObj = [NSValue valueWithCGRect:temp]; 
     [self.fatherNodes setObject:tempObj forKey:notificationNode.nodeName]; 
     [self setNeedsDisplay]; 
     NSLog(@"Should REDRAW NOW!"); // It print this but no drawing is made! 
    } 
} 
} 

nie jestem wklejając mój drawRect tutaj, ponieważ to działa, problemem jest to, że nie jest wywoływana z wewnątrz mojego UIView setNeedsDisplay!

Ktoś ma pojęcie, dlaczego to nie działa ????

Odpowiedz

25

Po wielu testach zobaczyłem coś związanego z wątkami, a fakt, że zestawNeedsDisplay powinien być wywoływany tylko w mainThread ... poza tym, że nigdy nie rozpocząłem wątku oddzielonego w tych klasach, klasa, która podniosła powiadomienie była w drugiej klasie wątek ... i aparently to było przyczyną problemu ...

go rozwiązać po prostu zmuszony setNeedsDisplay się nazywać w głównym wątku ..

dispatch_async(dispatch_get_main_queue(), ^{ 
      [self setNeedsDisplay]; 
}); 

Swift 3:

DispatchQueue.main.async { [weak self] in 
    self?.setNeedsDisplay() 
} 
+0

nie działa na iOS 9.3.1 – Idan

+0

To działa w iOS 9.3. 1 dla mnie. Problem polegał na tym, że byłem w innym wątku, tak jak mówi to rozwiązanie. –

1

myślę poprawny sposób z niego korzystać to:

[self setNeedsDisplay:YES]; 

Mimo, że zawsze mają problemy, aby dostać, że praca :(

+0

Idealne dzięki! –

Powiązane problemy