在没有UITableViewController的情况下,如何实现UITableView的下拉刷新功能?

181

我正在尝试在UIViewController中的UITableView实现下拉刷新功能。我不能使用UITableViewController,因为我希望UITableView成为视图控制器中较小的子视图,上面还有一些其他东西。我认为这是可能的,但是否有人见过这样的实现方式呢?

注:pull to refresh指下拉刷新功能
6个回答

470

在不使用UITableViewController的情况下,直接向UITableView添加刷新控件:

override func viewDidLoad() {
    super.viewDidLoad()
    let refreshControl = UIRefreshControl()
    refreshControl.addTarget(self, action: #selector(refresh(_:)), for: .valueChanged)

    if #available(iOS 10.0, *) {
        tableView.refreshControl = refreshControl
    } else {
        tableView.backgroundView = refreshControl
    }
}

@objc func refresh(_ refreshControl: UIRefreshControl) {
    // Do your job, when done:
    refreshControl.endRefreshing()
}

1
非常优秀和简单。当我在iOS 7.0.4上尝试将其添加到UIViewController的表视图中时,它对我很有效。 - thandasoru
6
有人遇到过控件本身不可见但其他方面似乎正常工作的问题吗? - remotevision
16
表格视图在“点击”后似乎会意外地向下跳动。目前还不确定原因。 - Bob Spryn
3
我发现它需要放在viewdidappear中,不确定这是否是iOS 7的功能 - 我还没有在iOS 8中进行测试... - Jack Solomon
4
刷新控件出现在表格视图的顶部。我通过以下方式解决了这个问题:将代码从 tableView.addSubview(refreshControl) 改为 tableView.insertSubview(refreshControl, atIndex: 0),这样可以将其放置在表格视图底层。 - kbpontius
显示剩余8条评论

13

Objective-C:

以下是如何为表格视图实现下拉刷新的方法。 与集合视图的情况相同,只需将table view alloc替换为collection view。

UITableView *tableViewDemo  =  [[UITableView alloc]init];
tableViewDemo.frame = CGRectMake(0,0,self.view.frame.size.width,self.view.frame.size.height);
tableViewDemo.dataSource =  self;
tableViewDemo.delegate =  self;
[self.view addSubView: tableViewDemo];

UIRefreshControl *refreshController = [[UIRefreshControl alloc] init];
[refreshController addTarget:self action:@selector(handleRefresh:) forControlEvents:UIControlEventValueChanged];
[tableViewDemo addSubview:refreshController];

#pragma mark - Handle Refresh Method

-(void)handleRefresh : (id)sender
{
   NSLog (@"Pull To Refresh Method Called");
   [refreshController endRefreshing];
}

为什么 Obj-C 版本只有 9 个赞,而 Swift 版本却有超过 430 个赞? - Chase Roberts
1
@ChaseRoberts,这个问题已经在2月13日得到了回答,请查看编辑历史记录,最初它是用Objective-C编写的。由于当时Swift还很新,每个人都在寻找Swift版本... https://stackoverflow.com/posts/15010646/revisions - Irfan

4

@berik的解决方案很好,但是UIController显示在UITableViewController的上方。修复它的方法是进行以下更改:

override func viewDidLoad() {
    let refreshControl = UIRefreshControl()
    refreshControl.addTarget(self, action: "refresh:", forControlEvents: .ValueChanged)
    tableView.backgroundView = refreshControl // <- THIS!!!
}

func refresh(refreshControl: UIRefreshControl) {
    // Do your job, when done:
    refreshControl.endRefreshing()
}

3
您的建议导致我的refreshControl消失,而不是出现在tableView下面。对我而言,refreshControl出现在tableView顶部。我通过tableView.insertSubview(refreshControl, atIndex: 0)进行修复,而不是使用tableView.addSubview(refreshControl) - kbpontius

3
我已经使用一个UIViewController和一个简单的表视图实现了EGORefreshTableHeaderView,技巧在于在EGO需要一个滚动视图作为参数的地方,如果你看一下表视图本身继承自滚动视图。
只需要这样做和一些额外的连接:)
希望这能帮到你。

-1

我最终使用了ODRefreshControl。 它不需要像上面那样的任何hack tableView.backgroundView = refreshControl,几乎以相同的方式工作,并提供更好的外观UI。


-1

看起来如果你在视图控制器的loadView方法中创建UIRefreshControl,一切都会正常工作。UIRefreshControl表现得像它应该的那样。在iOS 7.1和iOS 8.2上测试过。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接