iphone - 查看未更新,但主线程上的所有内容

标签 iphone objective-c uikit ios4

我试图在某些用户交互后在表格 View 顶部显示 UIProgressView。在我的表格 View 中,如果用户点击一个特定的单元格,我会向上滑动一个 UIView,其中包含一个带有栏项目的工具栏和一个选择器 View (它的行为非常像操作表)。当我这样做时,我会将屏幕外的 View 添加到当前 View ,然后为滑入设置动画。当用户做出选择并点击“完成”时, View 会滑出。此时,进度 View 应该会随着后台发生的某些事情而出现并更新。

我遇到的问题是,在“警报表”UIView 滑出当前 View 后,UI 中很长一段时间没有任何反应。当我显示滑动 View 时,我这样做:

[[[UIApplication sharedApploication] keyWindow] addSubview:slidingView];
CGRect newFrame = CGRectMake(...);
[UIView animateWithDuration:0.3
    animations:^{
        slidingView.frame = newFrame;
    }];

当用户点击滑动 View 中的“完成”按钮时,将调用此操作方法:

- (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 后不立即更新显示?

最佳答案

一旦代码完成执行,显示就会在主线程中更新,因此通过阻止主线程可以防止这种情况发生。

其中一个原因是更新被分批在一起,以便可以有效地重新绘制。

一种解决方案/解决方法是在hidden=NO之后在doneCallback中使用performSelector:afterDelay:0.01,将以下代码移动到延迟后运行的新选择器中。

或者,您可以将“doneCallback”中的代码作为后台操作运行(尽管您无法直接从后台线程更新 UIKit,因此您必须将消息发送到主线程以进行任何显示更新)。

关于iphone - 查看未更新,但主线程上的所有内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3879426/

相关文章:

ios - ContentsOfFile 方法在 swift 2.2 中弃用

ios - 如何在 Xcode 6 中为 Objective-C 和 Swift 创建临时日志记录书签和 FIXME 标记?

ios - iOS 7 上的 Push Segue 不显示导航栏

iphone - 为什么 Xcode 无法识别 -ignoreTouch :forEvent: in UITapGestureRecognizer subclass?

iphone - 应用程序加载器中的托管内容包是什么?

iphone - UIManagedDocument:网络中断时创建新文件时出错/崩溃(保存)

iphone - 如何在表格 View 单元格中设置背景颜色+不透明度+样式分组

ios - Apple 针对内联视频播放器的 iOS 政策是什么?

iOS : WHO'S in charge of refreshing UI/Screen while UITableView's scrolling?

reactjs - index.html 中 node_modules 中的引用文件夹(create-react-app)