SetNeedsDisplay无法正常工作
我看到了许多与这个问题有关的线索,但没有解决我的情况(我认为)。
我的情况应该很简单,我有我的控制器中的自定义UIView
,从我的控制器,我使用[ self.myView setNeedsDisplay
],它完美的作品。
我有问题,当我试图从UIView
本身内部调用这个…我有一个通知从另一个类发送,它正在接受我的观点(这工程)与它传递的信息,我更新这个视图的内部属性,比我打电话[self setNeedsDisplay
]希望我的屏幕更新与新的状态,但没有任何事情发生,我在drawRec
方法内使用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
被调用!
任何人有任何想法,为什么这不工作?
经过大量的testing后,我看到一些与线程有关的事实,setNeedsDisplay只能在mainThread中调用…除了我从未在这个类中启动分离的线程,引发通知的类在一个辅助线程中…而且这是造成这个问题的原因
解决它我只是强迫在主线程中调用setNeedsDisplay ..
dispatch_async(dispatch_get_main_queue(), ^{ [self setNeedsDisplay]; });
Swift 3:
DispatchQueue.main.async { [weak self] in self?.setNeedsDisplay() }
我认为使用它的正确方法是:
[self setNeedsDisplay:YES];
虽然我总是有问题得到那个工作:(