首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SetNeedsDisplay不工作

SetNeedsDisplay不工作
EN

Stack Overflow用户
提问于 2012-12-17 22:46:54
回答 2查看 12.7K关注 0票数 10

我看到了很多关于这个问题的帖子,但没有一个能解决我的问题(我想)。

我的案例应该很简单,我的控制器中有一个自定义的UIView,从我的控制器,我使用self.myView setNeedsDisplay,它工作得很好。

当我试图从UIView本身的内部调用它时,我遇到了问题……我有一个从另一个类发送的通知,它被我的视图接收到它传递的信息,我更新了这个视图的内部属性,然后我调用了self setNeedsDisplay,希望用新的状态更新我的屏幕,但什么都没有发生,我在我的drawRec方法中使用了一个NSLOG,它现在没有被调用,它只在我的控制器类调用setNeedsDisplay时被调用,当发生这种情况时,屏幕上显示了之前应该发生的更新...我不知道为什么之前没有更新。

下面是一些代码:

我的控制器请求更新:(工作正常!)

代码语言:javascript
复制
- (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];
}

我的通知方法试图更新我的绘图:(不起作用!)

代码语言:javascript
复制
- (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内部调用!

有没有人知道为什么这不起作用?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-20 21:05:48

经过大量的测试,我发现了一些与线程相关的东西,以及setNeedsDisplay应该只在mainThread...besides中调用的事实。在这个类中,我从来没有启动过单独的线程,引发通知的类显然是在第二个thread...and中,这导致了这个问题……

为了解决这个问题,我只是强制在主线程中调用setNeedsDisplay。

代码语言:javascript
复制
dispatch_async(dispatch_get_main_queue(), ^{
            [self setNeedsDisplay];  
});

Swift 3:

代码语言:javascript
复制
DispatchQueue.main.async { [weak self] in
    self?.setNeedsDisplay()
}
票数 28
EN

Stack Overflow用户

发布于 2013-01-07 13:44:38

我认为正确的用法是:

代码语言:javascript
复制
[self setNeedsDisplay:YES]; 

虽然我总是有问题来让它工作:(

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13916331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档