只是好奇,因为它不立即看起来可能,但有一种狡猾的方式来利用新的iOS 6 UIRefreshControl类而不使用UITableViewController子类吗?
我经常使用带有UITableView子视图的UIViewController,并符合UITableViewDataSource和UITableViewDelegate,而不是直接使用UITableViewController。
只是好奇,因为它不立即看起来可能,但有一种狡猾的方式来利用新的iOS 6 UIRefreshControl类而不使用UITableViewController子类吗?
我经常使用带有UITableView子视图的UIViewController,并符合UITableViewDataSource和UITableViewDelegate,而不是直接使用UITableViewController。
当前回答
事实证明,当你使用带有UITableView子视图的UIViewController并遵循UITableViewDataSource和UITableViewDelegate时,你可以使用以下方法:
self.refreshControl = [[UIRefreshControl alloc]init];
[self.refreshControl addTarget:self action:@selector(refresh:) forControlEvents:UIControlEventValueChanged];
其他回答
基于直觉,基于DrummerB的灵感,我尝试简单地添加一个UIRefreshControl实例作为子视图到我的UITableView。它神奇地工作了!
UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
[refreshControl addTarget:self action:@selector(handleRefresh:) forControlEvents:UIControlEventValueChanged];
[self.myTableView addSubview:refreshControl];
这添加了一个UIRefreshControl在你的表视图和工作的预期,而不需要使用UITableViewController:)
编辑:上面的方法仍然有效,但正如一些人指出的那样,当以这种方式添加UIRefreshControl时,会有轻微的“口吃”。一个解决方案是实例化一个UITableViewController,然后设置你的UIRefreshControl和UITableView,即:
UITableViewController *tableViewController = [[UITableViewController alloc] init];
tableViewController.tableView = self.myTableView;
self.refreshControl = [[UIRefreshControl alloc] init];
[self.refreshControl addTarget:self action:@selector(getConnections) forControlEvents:UIControlEventValueChanged];
tableViewController.refreshControl = self.refreshControl;
尝试在tableView重新加载其内容后延迟调用refreshControl -endRefresh方法几分之一秒,可以使用NSObject的-performSelector:withObject:afterDelay:或GCD的dispatch_after。
我在UIRefreshControl上创建了一个类别:
@implementation UIRefreshControl (Delay)
- (void)endRefreshingAfterDelay:(NSTimeInterval)delay {
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delay * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
[self endRefreshing];
});
}
@end
我测试了它,这也适用于集合视图。我注意到,一个小到 0.01秒就足够了:
// My data refresh process here while the refresh control 'isRefreshing'
[self.tableView reloadData];
[self.refreshControl endRefreshingAfterDelay:.01];
UIRefreshControl是一个UIView子类,你可以单独使用它。但我不确定它是如何呈现的。渲染可以简单地依赖于帧,但它也可以依赖于UIScrollView或UITableViewController。
无论哪种方式,它都将是一种hack而不是优雅的解决方案。我建议你找一个第三方的克隆版本,或者自己写一个。
ODRefreshControl
SlimeRefresh
Keller的第一个建议在iOS 7中导致了一个奇怪的错误,即在视图控制器重新出现后,表的插入增加了。换到第二个答案,使用uitableviewcontroller,为我解决了问题。
对于Swift 2.2。
首先创建UIRefreshControl()。
var refreshControl : UIRefreshControl!
在你的viewDidLoad()方法中添加:
refreshControl = UIRefreshControl()
refreshControl.attributedTitle = NSAttributedString(string: "Refreshing..")
refreshControl.addTarget(self, action: #selector(YourUIViewController.refresh(_:)), forControlEvents: UIControlEvents.ValueChanged)
self.tableView.addSubview(refreshControl)
并创建refresh函数
func refresh(refreshControl: UIRefreshControl) {
// do something ...
// reload tableView
self.tableView.reloadData()
// End refreshing
refreshControl.endRefreshing()
}