我看到了许多与此问题相关的线程,但没有一个解决我的情况(我认为)。
我的情况应该很简单,我有一个自定义UIView
在我的控制器中,从我的控制器中,我使用 [self.myView setNeedsDisplay
] 并且效果完美。
当我尝试从内部调用它时遇到问题UIView
本身...我有一个从另一个类发送的通知,我的视图(这有效)正在接收它及其传递的信息,我更新此视图的内部属性,然后我调用 [selfsetNeedsDisplay
] 希望我的屏幕更新为新状态,但什么也没有发生,我使用了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
!
任何人都知道为什么这不起作用???
经过大量测试,我看到了一些与线程相关的东西,事实上 setNeedsDisplay 应该只在主线程中调用...此外我从未在此类中启动单独的线程,引发通知的类位于辅助线程中...显然这是导致问题的原因......
为了解决这个问题,我只是强制在主线程中调用 setNeedsDisplay 。
dispatch_async(dispatch_get_main_queue(), ^{
[self setNeedsDisplay];
});
Swift 3:
DispatchQueue.main.async { [weak self] in
self?.setNeedsDisplay()
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)