我看到了很多关于这个问题的帖子,但没有一个能解决我的问题(我想)。
我的案例应该很简单,我的控制器中有一个自定义的UIView,从我的控制器,我使用self.myView setNeedsDisplay,它工作得很好。
当我试图从UIView本身的内部调用它时,我遇到了问题……我有一个从另一个类发送的通知,它被我的视图接收到它传递的信息,我更新了这个视图的内部属性,然后我调用了self setNeedsDisplay,希望用新的状态更新我的屏幕,但什么都没有发生,我在我的drawRec方法中使用了一个NSLOG,它现在没有被调用,它只在我的控制器类调用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内部调用!
有没有人知道为什么这不起作用?
发布于 2012-12-20 21:05:48
经过大量的测试,我发现了一些与线程相关的东西,以及setNeedsDisplay应该只在mainThread...besides中调用的事实。在这个类中,我从来没有启动过单独的线程,引发通知的类显然是在第二个thread...and中,这导致了这个问题……
为了解决这个问题,我只是强制在主线程中调用setNeedsDisplay。
dispatch_async(dispatch_get_main_queue(), ^{
[self setNeedsDisplay];
});Swift 3:
DispatchQueue.main.async { [weak self] in
self?.setNeedsDisplay()
}发布于 2013-01-07 13:44:38
我认为正确的用法是:
[self setNeedsDisplay:YES]; 虽然我总是有问题来让它工作:(
https://stackoverflow.com/questions/13916331
复制相似问题