zoukankan      html  css  js  c++  java
  • UIRefreshControl自动刷新

    不知道UIRefreshController是什么的朋友可以参考 iOS6新特征:UIRefreshControl[下拉刷新]使用示例 一文了解这是什么,这里只提怎么使用代码的方式触发UIRefreshControl显示spinner动画,并发起正常情况下下拉之后进行的流程。

    项目中需要在界面显示出来的时候进行自动拉取数据并刷新界面,要用一个UIRefreshControl显示其过程。

    界面VC是一个UIViewController,tableview被添加到其中,UIRefreshControl在viewDidLoad的时候被添加到tableview中。

    以下是相关代码:

    
    
    1. - (void)viewDidLoad  
    2. {  
    3.     [super viewDidLoad];  
    4.     [self setBackgroudImage];  
    5.     self.view.backgroundColor = [UIColor whiteColor];  
    6.       
    7.     self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 64.f, self.view.frame.size.width, self.view.frame.size.height - 64.f)  
    8.                                                   style:UITableViewStylePlain];  
    9.     self.tableView.delegate = self;  
    10.     self.tableView.dataSource = self;  
    11.     self.tableView.backgroundColor = [UIColor clearColor];  
    12.     self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;  
    13.     [self.view addSubview:self.tableView];  
    14.       
    15.     self.refreshControl = [[UIRefreshControl alloc] init];  
    16.     self.refreshControl.tintColor = [UIColor whitecolor];  
    17.       
    18.     [self.refreshControl addTarget:self  
    19.                             action:@selector(handleRefresh:)  
    20.                   forControlEvents:UIControlEventValueChanged];  
    21.     [self.tableView addSubview:self.refreshControl];  
    22. }  

    handleRefresh: 为正常情况下下拉tableview会触发的UIRefreshControl的操作,

    1. - (void) handleRefresh:(id)sender{  
    2.     //TODO: do something here  
    3. }  


    我们要做的是在viewDidAppear的时候完成tableview下拉,并且UIRefreshControl显示spinner表示正在refreshing。参考过以下两个帖子

    http://stackoverflow.com/questions/16687253/uirefreshcontrol-auto-start

    http://stackoverflow.com/questions/14718850/uirefreshcontrol-beginrefreshing-not-working-when-uitableviewcontroller-is-ins  

    但很遗憾,没有一个能做到这个,以下是我的解决方案:

    1. - (void)viewDidAppear:(BOOL)animated  
    2. {  
    3.     [super viewDidAppear:animated];  
    4.   
    5.     if (self.refreshControl.refreshing) {  
    6.         //TODO: 已经在刷新数据了  
    7.     } else {  
    8.         if (self.tableView.contentOffset.y == 0) {  
    9.               
    10.             [UIView animateWithDuration:0.25  
    11.                                   delay:0  
    12.                                 options:UIViewAnimationOptionBeginFromCurrentState  
    13.                              animations:^(void){  
    14.                                  self.tableView.contentOffset = CGPointMake(0, -self.refreshControl.frame.size.height);  
    15.                              } completion:^(BOOL finished){  
    16.                                  [self.refreshControl beginRefreshing];  
    17.                                  [self.refreshControl sendActionsForControlEvents:UIControlEventValueChanged];  
    18.                              }];  
    19.         }  
    20.     }  
    21. }  


    关键点:[self.refreshControl beginRefreshing]要在完成对tableview contentoffset的设置之后调用,另外要触发handleRefresh需要向UIRefreshControl主动发送一个UIControlEventValueChanged事件

    如果你遇到任何问题,可以在这里留下问题,我有时间会来回答。谢谢!

  • 相关阅读:
    file is universal (3 slices) but does not contain a(n) armv7s slice error for static libraries on iOS
    WebImageButton does not change images after being enabled in Javascript
    ajax OPTION
    编程遍历页面上所有TextBox控件并给它赋值为string.Empty?
    获取海洋天气预报
    C#线程系列教程(1):BeginInvoke和EndInvoke方法
    js控制只能输入数字和小数点
    Response.AddHeader(,)
    ManualResetEvent的理解
    Convert.ToInt32、int.Parse(Int32.Parse)、int.TryParse、(int) 区别
  • 原文地址:https://www.cnblogs.com/Peak-Banish/p/4170061.html
Copyright © 2011-2022 走看看