2012-12-17 5 views
7

Bu sorunla ilgili birçok konu gördüm, ancak hiçbiri benim durumumu ele almıyor (sanırım).SetNeedsDisplay çalışmıyor

Durumum basit olmalı, denetleyicimde özel bir UIView var, denetleyiciden [self.myView setNeedsDisplay] kullanın ve mükemmel çalışıyor.

UIView'un kendisinden bunu çağırmaya çalıştığımda sorun yaşıyorum ... Başka bir sınıftan gönderilmek üzere bir bildirim aldım ve bu benim Görünümüm tarafından alındı ​​(bu çalışma) bilgilerle birlikte geçer, bu görünümün iç özelliklerini güncellerim ve ekranımı yeni durumlarla güncellemek isteyen [self setNeedsDisplay] 'i çağırıyorum ama hiçbir şey olmuyor, benim drawRec yöntemimin içinde kullanıyorum ve Bu zamanda denir, sadece benim denetleyici sınıfım setNeedsDisplay aradığında ve bu olduğunda, daha önce gerçekleşmiş olması gereken güncelleme ekranda gösterildi ... denir. Neden daha önce güncellenmiyor ...

Benim denetleyicisi güncelleme için soran:İşte bazı kod vardır (! Tamam çalışır) Benim bildirim yöntemi resmimi güncellemeye çalışıyorum

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

: (Çalışmıyor!)

- (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! 
    } 
} 
} 

bunun işe yaradığını, çünkü sorun bu benim UIView setNeedsDisplay içinden çağrılan değil mi burada benim drawRect yapıştırarak değilim!

Bunun neden çalışmadığı konusunda herhangi bir fikri olan var mı ????

cevap

25

Test ettikten sonra, thread'lerle ilgili bir şey gördüm ve setNeedsDisplay yalnızca mainThread'de çağrılmalı ... yanı sıra, bu derslerde ayrılmamış bir iş parçacığı başlatmadım, Bildirimi yükselten sınıf ikincil iplik ... ve aparently bu soruna neden oldu ... ..

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

Swift 3

bunu çözün için sadece ana iş parçacığı çağrılacak setNeedsDisplay zorla:

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

O iOS 9.3 de çalışır iOS 9.3.1 – Idan

+0

çalışmıyor mu almak için problem rağmen. 1 benim için. Sorun, tıpkı çözümün söylediği gibi başka bir konudaydı. –

1

onu kullanmak için doğru yol olduğunu düşünüyorum:

[self setNeedsDisplay:YES]; 

hep bu çalışma :(

+0

Mükemmel, teşekkürler !!! –