我试图在某些用户交互后在表视图上显示UIProgressView。在我的表格视图中,如果用户点击一个特定单元格,我会向上滑动一个UIView,其中包含一个带有条形项和拾取器视图的工具栏(它非常像一个操作表)。当我这样做时,我将屏幕外的视图添加到当前视图,然后为幻灯片添加动画。当用户进行选择并点击“完成”时,视图将滑出。此时,进度视图应该出现并更新,因为有些事情正在后台发生。
我遇到的问题是,在“警报表”UIView滑出当前视图之后,UI中没有任何事情发生。当我显示滑动视图时,我这样做:
[[[UIApplication sharedApploication] keyWindow] addSubview:slidingView];
CGRect newFrame = CGRectMake(...);
[UIView animateWithDuration:0.3
animations:^{
slidingView.frame = newFrame;
}];
当用户在滑动视图中点击“完成”按钮时,将调用此操作方法:
- (void) done {
NSNumber *row = GetSelectedRowSomehow();
[self dismiss:@selector(doneCallback:) withObject:row];
}
- (void) dismiss:(SEL)cb withObject:(id)obj {
[UIView animateWithDuration:0.3
animations:^{
slidingView.frame = CGRectMake(...);
}
completion:^(BOOL finished) {
[self.delegate performSelectorOnMainThread:cb
withObject:obj
waitUntilDone:NO];
[slidingView performSelectorOnMainThread:@selector(removeFromSuperview:)
withObject:nil
waitUntilDone:NO];
}];
}
这里调用的回调:
- (void) doneCallback {
self.dialogView.hidden = NO;
self.progressView.progress = 0;
for (float i = 0; i < 1.0; i += 0.1) {
self.progressView.progress += i;
sleep(0.5);
}
}
就我而言,dialogView
直到callback
完成后才会显示。为什么在hidden
属性设置为NO
后立即更新显示?
答案 0 :(得分:2)
一旦代码完成执行,显示就会在主线程中更新,所以通过阻止主线程来防止发生这种情况。
其中一个原因是更新是一起批处理的,因此可以有效地重新绘制。
一个解决方案/解决方法是在hidden = NO之后使用performSelector:afterDelay:0.01到doneCallback,将以下代码移动到延迟后运行的新选择器。
或者你可以在“doneCallback”中运行代码作为后台操作(虽然你不能直接从后台线程更新UIKit,所以你必须向主线程发送消息以进行任何显示更新。)