【发布时间】:2012-05-04 17:07:27
【问题描述】:
我正在尝试在 UIViewController 内的 UITableView 中实现拉动刷新功能。我不能使用 UITableViewController 因为我希望 UITableView 是视图控制器中的一个较小的子视图,上面还有一些其他的东西。我认为这是可能的,但有人看过它的实现吗?
【问题讨论】:
标签: ios objective-c iphone uitableview pull-to-refresh
我正在尝试在 UIViewController 内的 UITableView 中实现拉动刷新功能。我不能使用 UITableViewController 因为我希望 UITableView 是视图控制器中的一个较小的子视图,上面还有一些其他的东西。我认为这是可能的,但有人看过它的实现吗?
【问题讨论】:
标签: ios objective-c iphone uitableview pull-to-refresh
我已经用 UIViewController 和一个简单的表格视图实现了 EGORefreshTableHeaderView,诀窍是在 EGO 将滚动视图作为参数的地方,如果您查看表格视图本身继承自滚动视图。
它只需要这个和一些额外的连接:)
希望这会有所帮助。
【讨论】:
直接向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()
}
【讨论】:
tableView.insertSubview(refreshControl, atIndex: 0) 而不是 tableView.addSubview(refreshControl)
看来,如果您在 viewController 的 loadView 方法中创建 UIRefreshControl,一切正常。 UIRefreshControl 的行为应如此。使用 iOS 7.1 和 iOS 8.2 测试
【讨论】:
@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()
}
【讨论】:
refreshControl 消失,而不是出现在 tableView 下方。我通过以下方式解决了这个问题: tableView.insertSubview(refreshControl, atIndex: 0) 而不是 tableView.addSubview(refreshControl)
Objective-C:
这就是您可以为表格视图实施拉动刷新的方法。 与集合视图的情况相同。只需用集合视图替换表视图分配。
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];
}
【讨论】:
我最终使用了ODRefreshControl。
它不需要像上面的 tableView.backgroundView = refreshControl 这样的任何 hack,工作方式几乎相同,并且提供了更好看的 UI。
【讨论】: