实现 Pull-to-refresh 将 UITableViewController 中的单元格向下移动

Posted

技术标签:

【中文标题】实现 Pull-to-refresh 将 UITableViewController 中的单元格向下移动【英文标题】:Implementing Pull-to-refresh shifts the cells in UITableViewController downwards 【发布时间】:2015-06-03 12:31:35 【问题描述】:

我在放置 UITableViewController 并同时拉动刷新时遇到问题。

我已经实现了拉动刷新,并在实现拉动刷新时对服务器进行 API 调用,并获取数据并显示在表格视图列表中。问题是在拉动刷新时,表格从其实际位置向下移动。 下面是我的代码和截图。

viewDidLoad

 refreshControl = [[UIRefreshControl alloc] init];
    [refreshControl addTarget:self action:@selector(handleRefresh:) forControlEvents:UIControlEventValueChanged];
    [self.tableView addSubview:refreshControl];



- (void)handleRefresh:(id)sender

    // do your refresh here...
    [self Data];//method to get data from server
    [refreshControl endRefreshing];


非常感谢任何帮助。

【问题讨论】:

【参考方案1】:

UITableViewController 有一个内置的刷新控件。您不想将新的作为子视图添加到 tableview。只需初始化self.refreshControl

viewDidLoad 
  self.refreshControl = [[UIRefreshControl alloc] init];
  [self.refreshControl setTintColor:[UIColor lightGrayColor]];
  [self.refreshControl addTarget:self action:@selector(didRefresh:) forControlEvents:UIControlEventValueChanged];


- (void)didRefresh:(UIRefreshControl *)sender 
  [sender endRefreshing];
  [self Data];

【讨论】:

谢谢,我应用了您的代码,但现在当我下拉时,表格中没有指示器视图。下拉时不调用 didRefresh 方法。 确保您没有在子类中覆盖 refreshControl。 self.refreshControl 是在 UITableViewController 中实现的,所以你不需要在你的类中声明它。 这个工作但 didRefresh 方法在下拉时调用了两次,这并没有解决我的问题。 确保没有其他东西调用刷新方法,并且您包括 [sender endRefreshing]。在 didRefresh 中放置一个断点并检查发件人。如果仍有问题,请发布一些代码。 我检查了我的代码在这个方法中: - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView float endScrolling = scrollView.contentOffset.y + scrollView.frame.size.height; if (endScrolling >= scrollView.contentSize.height) NSLog(@"Scroll End Called");底部刷新=是; [自身数据]; where [自我数据];再次调用。

以上是关于实现 Pull-to-refresh 将 UITableViewController 中的单元格向下移动的主要内容,如果未能解决你的问题,请参考以下文章

在 Flutter 中使用 Riverpod 实现 pull-to-refresh

如何在 UIView(不是 UITableView、UICollectionView、UIScrollView)上添加 Pull-to-refresh

UIScrollView 以启动为中心

在 UIViewController 中使用 UIRefreshControl 和 UITableView

零速度的CALayer不会改变它的位置

Android 使用 Pull to Refresh 实现 SwipeListView