在viewDidLoad上的UIRefreshControl

我正在使用下面的代码来创build一个UIRefreshControl:

- (void) viewDidLoad { [super viewDidLoad]; UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init]; [refreshControl addTarget:self action:@selector(doLoad) forControlEvents:UIControlEventValueChanged]; self.refreshControl = refreshControl; } - (void) doLoad { dispatch_async(dispatch_get_global_queue(0, 0), ^{ // Instead of sleeping, I do a webrequest here. [NSThread sleepForTimeInterval: 5]; dispatch_async(dispatch_get_main_queue(), ^{ [tableView reloadData]; [self.refreshControl endRefreshing]; }); }); } 

它工作很好。 如果我导航到我的视图,拖动表,代码运行和数据显示。

不过,我想要做的就是一旦出现“加载”状态(即用户知道正在发生的事情),就可以看到这个状态。 我曾尝试添加以下内容:

 - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; [self.refreshControl beginRefreshing]; } 

但似乎没有工作。 当我导航到视图,看起来像一个常规的视图(刷新控制不可见),加上当我试图拉刷新控制,它永远不会完成加载。

很明显,我正在做这个错误的方式。 任何build议我应该如何处理?

尝试这个:

 - (void) viewWillAppear: (BOOL) animated { [super viewWillAppear: animated]; self.tableView.contentOffset = CGPointMake(0, -self.refreshControl.frame.size.height); [self.refreshControl beginRefreshing]; // kick off your async refresh! [self doLoad]; } 

记得打电话endRefreshing在某个时候!

编辑添加完整的工作示例:

这个示例视图控制器,作为根视图控制器在iOS6.1中构build和运行,从应用程序启动时已经可见的UIRefreshControl开始。

TSTableViewController.h

 @interface TSTableViewController : UITableViewController @end 

TSTableViewController.m

 #import "TSTableViewController.h" @implementation TSTableViewController { NSMutableArray* _dataItems; } - (void) viewDidLoad { [super viewDidLoad]; self.refreshControl = [UIRefreshControl new]; [self.refreshControl addTarget: self action: @selector( onRefresh: ) forControlEvents: UIControlEventValueChanged]; } - (void) viewWillAppear:(BOOL)animated { [super viewWillAppear: animated]; self.tableView.contentOffset = CGPointMake(0, -self.refreshControl.frame.size.height); [self.refreshControl beginRefreshing]; [self onRefresh: nil]; } - (void) onRefresh: (id) sender { double delayInSeconds = 2.0; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ _dataItems = [NSMutableArray new]; for ( int i = 0 ; i < arc4random() % 100 ; i++ ) { CFUUIDRef uuid = CFUUIDCreate( NULL ); [_dataItems addObject: CFBridgingRelease(CFUUIDCreateString( NULL, uuid)) ]; CFRelease( uuid ); } [self.refreshControl endRefreshing]; [self.tableView reloadData]; }); } #pragma mark - Table view data source - (NSInteger) numberOfSectionsInTableView: (UITableView *) tableView { return 1; } - (NSInteger) tableView:(UITableView *) tableView numberOfRowsInSection: (NSInteger) section { return _dataItems.count; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle: UITableViewCellStyleDefault reuseIdentifier: nil]; cell.textLabel.text = [_dataItems objectAtIndex: indexPath.row]; return cell; } @end 

手动修改contentOffset不安全和错误的 ,在某些情况下会导致意外的行为。 这个解决scheme的工作原理完全不涉及contentOffset

 func showRefreshControl(show: Bool) { if show { refreshControl?.beginRefreshing() tableView.scrollRectToVisible(CGRectMake(0, 0, 1, 1), animated: true) } else { refreshControl?.endRefreshing() } } 

另一个select是在viewDidAppear中触发UIControlEventValueChanged :触发​​初始刷新。

  - (void) viewDidAppear: (BOOL) animated { [super viewDidAppear: animated]; UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init]; [refreshControl addTarget:self action:@selector(doLoad) forControlEvents:UIControlEventValueChanged]; self.refreshControl = refreshControl; [self.refreshControl beginRefreshing]; } 

你从来没有设置self.refreshControl