UIRefreshControl on viewDidLoad

前端 未结 4 1946
再見小時候
再見小時候 2020-12-13 01:02

I\'m using the following code to create a UIRefreshControl:

- (void) viewDidLoad
{
    [super viewDidLoad];

    UIRefreshControl *refreshControl = [[UIRefre         


        
相关标签:
4条回答
  • 2020-12-13 01:20

    Another option is fire a UIControlEventValueChanged in your viewDidAppear: to trigger an initial refresh.

    0 讨论(0)
  • 2020-12-13 01:22
       - (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];    
    
       }
    

    You never set self.refreshControl

    0 讨论(0)
  • 2020-12-13 01:26

    Manually modifying the contentOffset is insecure and wrong and can lead to unexpected behavior in some cases. This solution works without touching the contentOffset at all:

    func showRefreshControl(show: Bool) {
        if show {
            refreshControl?.beginRefreshing()
            tableView.scrollRectToVisible(CGRectMake(0, 0, 1, 1), animated: true)
        } else {
            refreshControl?.endRefreshing()
        }
    }
    
    0 讨论(0)
  • 2020-12-13 01:37

    Try this:

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

    Remember to call endRefreshing at some point!

    EDIT to add full working sample:

    This sample view controller, built and run in iOS6.1 as the root viewcontroller starts with the UIRefreshControl already visible and animating when the app launches.

    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
    
    0 讨论(0)
提交回复
热议问题