2012-12-17 31 views
7

我看到與此相關的問題很多線程,但沒有解決我的情況(我認爲)。SetNeedsDisplay不工作

我的情況應該很簡單,我的控制器中有一個自定義的UIView,從我的控制器,我使用[self.myView setNeedsDisplay],它的工作原理非常完美。

我有問題,當我試圖從UIView本身內部調用此...我有一個通知從另一個類發送,並且它正在被我的View(這工作)與它的信息接收通行證,我更新這個觀點的內在性能和比我打電話的[自setNeedsDisplay]希望有我的屏幕,新的狀態更新,但什麼也沒發生,我用我的NSLOG方法drawRec裏面,它是不是被所謂在這個時候,它只是叫我時,控制器類調用setNeedsDisplay,以及當發生這種情況,應該已經發生過的更新顯示在屏幕上......我不知道爲什麼它不前更新中...

下面是一些代碼:

我控制器要求更新:(!工作確定)

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

我的通知方法試圖更新我的畫:(不工作! )

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

我不會粘貼我drawRect這裏,因爲它的工作原理,問題是,是不是從我UIView setNeedsDisplay內部調用!

任何人有,爲什麼這是行不通的任何想法????

回答

25

經過很多測試,我看到了與線程相關的東西,而setNeedsDisplay只能在mainThread中調用......除了我從未在此類中啓動過分離線程,引發通知的類在輔助螺紋...和aparently這是導致該問題...

解決它,我只是被迫setNeedsDisplay在主線程中調用..

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

斯威夫特3:

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

不上的iOS 9.3.1 – Idan

+0

工作,它在iOS的9.3工作。 1對我來說。問題出在我在另一個線程上,就像解決方案所說的那樣。 –

1

我想使用它的正確方法是:

[self setNeedsDisplay:YES]; 

雖然我一直有問題,得到該工作:(

+0

完美,謝謝! –