UIAlertController有时会阻止UIRefreshControl隐藏

koe*_*oen 6 objective-c ios uirefreshcontrol uialertcontroller

UIRefreshControl在我的tableview上使用更新项目.最后,我展示了一个UIAlertController通知用户更新已完成,以及更新了多少项目.非常简单,它适用于一件事.如果我连续多次刷新,有时即使解除警报后刷新控制也不会被解除.我需要向上滑动桌子才能让它消失.

这是我使用的代码,所有UI的东西都很好地在主线程上完成:

    if(refreshControl.refreshing) {
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            [self refreshItems];

            dispatch_async(dispatch_get_main_queue(), ^{
                [refreshControl endRefreshing];
                [self.tableView reload];
                [self showUpdateInfo];                     
            });
        });
    }
Run Code Online (Sandbox Code Playgroud)

知道是什么原因引起的吗?

编辑:这是我在代码(in viewDidLoad)中创建刷新控件的方式:

UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
refreshControl.attributedTitle   = [[NSAttributedString alloc] initWithString: @"Checking for updates…"];
[refreshControl addTarget: self
                   action: @selector(refreshOutdatedItems)
         forControlEvents: UIControlEventValueChanged];

self.refreshControl = refreshControl;
Run Code Online (Sandbox Code Playgroud)

Joh*_*vin 7

延迟任意时间并不是一个非常干净的解决方案.在我看来,通过计算一倍到1000万来实现延迟也是一个黑客攻击.

我最终做的是类似于这个伪Swift:

let alert = UIAlertController(...)
present(alert, animated: true) {
    refreshControl.endRefreshing()
}
Run Code Online (Sandbox Code Playgroud)

它会将调用延迟到endRefreshing(),直到出现警报.

我使用Swift 3和PromiseKit的实际代码看起来更像是这样的:

@IBAction func onRefresh() {
    Repository.getNewData().then { data in
        self.data = data
        self.tableView.reloadData()
    }.recover { error in
        // Return a promise to make sure endRefreshing isn't called until the alert is presented.
        return self.presentErrorAlert(message: "Some user-friendly message")
    }.always {
        self.refreshControl?.endRefreshing()
    }
}

private func presentErrorAlert(message: String) -> Promise<Void> {
    return Promise<Void> { fulfill, _ in
        let alert = UIAlertController(title: "Error", message: message, preferredStyle: .alert)
        alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
        self.present(alert, animated: true) {
            fulfill()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这应该是接受的答案 - 延迟任意数量是一个黑客. (3认同)

Dre*_*ren 5

这些对我有用:

    refreshControl.endRefreshing()
    tableView.setContentOffset(CGPoint.zero, animated: true)
    -- show alert than --
Run Code Online (Sandbox Code Playgroud)


Yan*_*Yan -5

我相信这确实与在 UIAlertController 出现之前 tableView 没有向上滚动有关。我尝试设置 showUpdateInfo 方法的延迟,这似乎有效。我猜当用户只拉一次时,需要半秒的时间来显示 UIAlertController 检查是否有帮助。这是我的代码

- (void)refreshOutdatedItems
{
    NSLog(@"refresh");

    if (self.refreshControl.refreshing) {
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            for (double i = 0 ; i < 100000000; i++){

            };

            dispatch_async(dispatch_get_main_queue(), ^{

                [self.refreshControl endRefreshing];
                [self performSelector:@selector(showUpdateInfo) withObject:nil afterDelay:0.5];

            });
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

如果有帮助请告诉我。