SetNeedsDisplay不起作用

时间:2012-12-17 14:46:54

标签: ios setneedsdisplay

我看到许多线程与此问题有关,但没有一个解决我的问题(我认为)。

我的情况应该很简单,我的控制器中有一个自定义UIView,来自我的控制器,我使用[self.myView setNeedsDisplay]并且它完美无缺。

当我试图从UIView本身内部调用它时,我遇到了问题...我从另一个类发送了一个通知,并且我的View(这个工作)正在接收它它传递的信息,我更新了这个视图的内部属性,而不是我正在调用[self setNeedsDisplay]希望我的屏幕更新为新状态,但没有发生任何事情,我使用{{1}在我的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内部调用!

任何人都知道为什么这不起作用????

2 个答案:

答案 0 :(得分:27)

经过大量的测试后,我看到了一些与线程相关的东西,事实上setNeedsDisplay只能在mainThread中调用...除了我从未在这个类中启动过一个separeted线程,引发Notification的类在一个辅助线程中......而且这显然导致了这个问题......

解决它我只是强制在主线程中调用setNeedsDisplay ..

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

斯威夫特3:

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

答案 1 :(得分:1)

我认为使用它的正确方法是:

[self setNeedsDisplay:YES]; 

虽然我总是遇到问题但仍然有问题:(

相关问题