iOS 10.0 UIRefreshControl 不显示指示器

Posted

技术标签:

【中文标题】iOS 10.0 UIRefreshControl 不显示指示器【英文标题】:iOS 10.0 UIRefreshControl not showing indicator 【发布时间】:2016-09-14 11:26:15 【问题描述】:

我正在使用具有下拉刷新功能的 UITableView,但是当我调用 [self.refreshControl beginRefreshing] 时,下拉刷新的微调器没有显示

上面的代码是在 viewDidLoad 内部调用的,因为表格最初正在加载一些数据。如果我在初始刷新后执行下拉刷新,微调器工作正常。显示标题,但不显示微调器。

似乎无法解决这个问题。它在 ios 9.3.2 上运行良好,但在 iOS 10 上运行良好。

这是我目前使用的代码。

- (void)viewDidLoad

    [super viewDidLoad];
    [self setupView];
    [self customSetup];
    self.refreshControl = [[UIRefreshControl alloc] init];
    self.refreshControl.attributedTitle = [[NSAttributedString alloc] initWithString:@"Updating Discounts..."];
    [self.refreshControl addTarget:self action:@selector(reloadDeals) forControlEvents:UIControlEventValueChanged];
    [self.refreshControl beginRefreshing];
    [self.tableView setContentOffset:CGPointMake(0, -self.refreshControl.frame.size.height) animated:YES];

提前感谢您的帮助

【问题讨论】:

嗨。你好吗?你找到解决方案了吗?谢谢。问候。 启用 UITableView 弹跳属性 【参考方案1】:

代码前:

[refreshControl beginRefresh]

插入代码:

[refreshControl layoutIfNeeded]

【讨论】:

这为我解决了这个问题。感谢您的帮助。 这对我来说不适用于 iOS 11。其他答案也没有:( 我最终延迟了beginRefreshing() 调用并将内容偏移设置为viewWillAppear 内的0.01 秒。仍然有一些小故障,但它“没关系”......@vivektakrani【参考方案2】:

在 viewDidLoad 中延迟刷新调用对我有用:

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^
        [self.refreshControl beginRefreshing];
);

【讨论】:

【参考方案3】:

与@jpros 的答案相同,但速度很快

if #available(iOS 10.0, *) 
    tableView.refreshControl = refreshControl
 else 
    tableView.addSubview(refreshControl)

refreshControl.layoutIfNeeded()
refreshControl.beginRefreshing()

【讨论】:

【参考方案4】:

这是 iOS 10 中已知和报告的错误。

Radar rdar://27468436

我不确定是否有任何解决方法。

【讨论】:

看到他们没有在 GM 中修复它,是否有可能,有变化并且我们需要做一些不同的事情? 10.1 测试版发布,有人检查吗?【参考方案5】:

您需要致电 [self.view layoutIfNeeded] 以在 iOS 10 中修复它。就我而言,致电 viewDidLoad 就足够了(我在该项目中使用故事板)。对于其他情况,viewWillAppear 更适合。

- (void)viewDidLoad
  
   [super viewDidLoad];
   [self.view layoutIfNeeded];
   ...

【讨论】:

投反对票时请解释原因。否则没有意义 这在初始化我的 tableView 后对我有用。例如,在viewWillAppear 上调用self.view.layoutIfNeeded。我正在使用 swift。 这对我有用!谢谢你!!我确实必须把它放在 viewwillappear 中,而不是 viewdidload 中。【参考方案6】:

我只能通过调用 viewDidLoad() 来解决这个问题:

refreshControl.layoutIfNeeded()

【讨论】:

【参考方案7】:

在 iOS10 中,我们应该使用 UITableView 或 UICollectionView 的 setRefreshControl 来添加 UIRefreshControl。

if([self.tableView respondsToSelector:@selector(setRefreshControl:)]) 
    [self.tableView setRefreshControl:self.refreshControl];

else 
    [self.tableView addSubview:self.refreshControl];

[self.refreshControl layoutIfNeeded];
[self.refreshControl beginRefreshing];

【讨论】:

【参考方案8】:

如果您的刷新指示器未显示,请尝试在 Interface Builder 中为表格视图或滚动视图启用 Bounce Vertically。

【讨论】:

以上是关于iOS 10.0 UIRefreshControl 不显示指示器的主要内容,如果未能解决你的问题,请参考以下文章

完全禁用 UIRefreshControl - iOS

UIRefreshControl 刷新后不隐藏。 iOS

iOS 13 UISearchController + UIRefreshControl 故障

iOS UIRefreshControl-刷新tableView

临时显示其他选项卡时 UIRefreshControl 冻结(iOS 7)

UIRefreshControl 有条件地为 ios 5 及更低版本声明