拉动以刷新没有UITableViewController的UITableView


180

我正在尝试在UIViewController的UITableView中实现拉动刷新功能。我不能使用UITableViewController,因为我希望UITableView是视图控制器中的一个较小的子视图,上面还有其他一些东西。我认为这是可能的,但是有人看到过它的实现吗?

Answers:


465

将刷新控件直接添加到中,UITableView而不使用UITableViewController

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 2014年

5
有没有人遇到控件本身不可见但其他方面似乎可以正常工作的问题?
remotevision 2014年

16
表格视图“点击”后似乎意外跳下。不知道为什么。
Bob Spryn 2014年

3
我发现它需要进入viewdidappear,不确定这是否是iOS 7功能-我尚未在iOS 8中对其进行测试...
Jack Solomon

4
refreshControl出现在tableView的顶部。我是通过以下方式解决此问题的:tableView.insertSubview(refreshControl, atIndex: 0)而不是tableView.addSubview(refreshControl)
kbpontius

12

目标-C

这是实现表视图刷新的方式。与集合视图相同。只需将表视图alloc替换为集合视图即可。

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];
}

当swift版本的> 430时,obj-c版本如何只有9个upvotes?
Chase Roberts

1
@ChaseRoberts,一个回答是2月13日,看看编辑历史,最初是在Objective-C中,因为那时swift是新的,所以每个人都在寻找swift版本... 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。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.