ios - UIAlertController 有时会阻止 UIRefreshControl 隐藏

标签 ios objective-c uialertcontroller uirefreshcontrol

我在我的 tableview 上使用 UIRefreshControl 来更新项目。最后,我显示一个 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];                     
            });
        });
    }

知道是什么原因造成的吗?

编辑:这就是我在代码中创建刷新控件的方式(在 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;

最佳答案

延迟任意时间并不是一个非常干净的解决方案。在我看来,通过加倍到 1000 万来实现延迟也有点不合时宜。

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

let alert = UIAlertController(...)
present(alert, animated: true) {
    refreshControl.endRefreshing()
}

它会延迟对 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()
        }
    }
}

关于ios - UIAlertController 有时会阻止 UIRefreshControl 隐藏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41534375/

相关文章:

ios - ProductName-Swift.h 不会在更改相应的 Objective-C 文件时更新

objective-c - 在基于文档的应用程序中连接菜单项

ios - Swift 将箭头和 sourceView 添加到 UIAlertController

ios - 如何使用默认值在 alertView 中创建 tableView?

ios - Xcode UICollectionView - 选择项目并发送到多个 UIViewControllers

ios - 在图像上绘画 (UIImageView) ipad 应用程序

objective-c - 无法识别的选择器已发送到实例IOS 10

ios - 使用 UITextField 在 tableview 末尾添加行

ios - 有没有办法在 swift ios 应用程序中忘记 AzureAD MSAL 中的登录帐户?

iphone - iOS 崩溃报告 : atos not working as expected