SetNeedsDisplay 不工作
Posted
技术标签:
【中文标题】SetNeedsDisplay 不工作【英文标题】:SetNeedsDisplay not working 【发布时间】:2012-12-17 14:46:54 【问题描述】:我看到了许多与此问题相关的线程,但没有一个解决我的情况(我认为)。
我的情况应该很简单,我的控制器中有一个自定义 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
内部调用!
任何人都知道为什么这不起作用????
【问题讨论】:
【参考方案1】:经过大量测试,我看到了一些与线程相关的东西,而且 setNeedsDisplay 应该只在 mainThread 中调用......除了我从未在这些类中启动单独的线程之外,引发通知的类在辅助线程中...显然这是导致问题的原因...
为了解决它,我只是强制在主线程中调用 setNeedsDisplay..
dispatch_async(dispatch_get_main_queue(), ^
[self setNeedsDisplay];
);
斯威夫特 3:
DispatchQueue.main.async [weak self] in
self?.setNeedsDisplay()
【讨论】:
它确实适用于我的 ios 9.3.1。问题是我在另一个线程上,就像解决方案所说的那样。【参考方案2】:我认为正确的使用方法是:
[self setNeedsDisplay:YES];
虽然我总是遇到问题来解决这个问题:(
【讨论】:
以上是关于SetNeedsDisplay 不工作的主要内容,如果未能解决你的问题,请参考以下文章
SetNeedsDisplay导致应用程序在TouchesMoved事件中崩溃
即使在使用 view.setNeedsDisplay() 刷新视图后,.isHidden 属性也不反映对视图的更改
有没有办法知道“setNeedsDisplay”的发件人是谁?