iOS - UIRefreshControl 刷新数据

前言

    NS_CLASS_AVAILABLE_IOS(6_0) __TVOS_PROHIBITED @interface UIRefreshControl : UIControl

1、UIRefreshControl

  • UITableViewController 自带刷新控件。
  • 使用 StoryBoard 创建的表格视图控制器可在 SB 的 TableViewController 中将 Refreshing 项设置为 Enableed,在控件为列表中将自动添加一个名为 Refresh Control 的控件,将该控件连接到代码中的自定义加载数据方法,即可实现刷新数据的操作。
  • 纯代码创建的 TableViewController 可以直接使用 self.refreshControl = [[UIRefreshControl alloc] init]; 实例化刷新控件。然后向 self.refreshControl 中添加自定义加载数据方法,即可实现刷新数据的操作。

1.1 StoryBoard 方式创建

  • 实例化刷新控件

        Refreshing : Enabled 开启刷新控件
                     Disabled 关闭刷新控件
    
        IBAction   : - (IBAction)downloadData ,将 Refresh Control 控件连接到代码中的自定义方法。
  • 设置刷新控件属性
        Title      : 设置刷新控件下边的提示文字及文字的颜色,也可使用代码设置
    
        Background : 设置刷新控件背景视图的颜色,设置了颜色之后,下拉的时候控件会随下拉向下滑动
        Tint       : 设置控件的颜色,也可使用代码设置
    
        // 设置刷新控件的颜色
        self.refreshControl.tintColor = [UIColor redColor];
    
        // 设置刷新控件下边的提示文字及文字的颜色
        self.refreshControl.attributedTitle = [[NSAttributedString alloc] initWithString:@"松开手开始刷新"];
  • 开始/停止刷新
        // 判断是否正在刷新,readonly
        BOOL isRefreshing = self.refreshControl.isRefreshing;
    
        // 开始刷新,在 TableViewController 中,下拉表格自动刷新,使用方法开始刷新时表格自动下拉
        [self.refreshControl beginRefreshing];
    
        // 停止刷新,刷新完成后必须调用停止刷新方法
        [self.refreshControl endRefreshing];

1.2 纯代码方式创建

  • 实例化刷新控件

        // refreshControl 为 TableViewController 的属性,无需声明
        self.refreshControl = [[UIRefreshControl alloc] init];
    
        // 添加刷新方法
        [self.refreshControl addTarget:self action:@selector(downloadData) forControlEvents:UIControlEventValueChanged];
  • 开始/停止刷新
        // 判断是否正在刷新,readonly
        BOOL isRefreshing = self.refreshControl.isRefreshing;
    
        // 开始刷新,在 TableViewController 中,下拉表格自动刷新,使用方法开始刷新时表格自动下拉
        [self.refreshControl beginRefreshing];
    
        // 停止刷新,刷新完成后必须调用停止刷新方法
        [self.refreshControl endRefreshing];
  • 设置刷新控件属性
        // 设置刷新控件的颜色
        self.refreshControl.tintColor = [UIColor redColor];
    
        // 设置刷新控件下边的提示文字及文字的颜色
        self.refreshControl.attributedTitle = [[NSAttributedString alloc] initWithString:@"松开手开始刷新"];

2、refreshControl 的使用

  • Objective-C

    • VideoModel.h

          // copy 属性,在设置数值的时候,如果有一方是可变的,会默认做一次 copy 操作,会建立新的副本
          @property (nonatomic, copy) NSString *name;
          @property (nonatomic, copy) NSString *teacher;
      
          // 为了避免服务端返回的数值型数据是 null,可以把数值型的数据设置成 NSNumber
          @property (nonatomic, copy) NSNumber *length;
    • VideoCell.h
          @class VideoModel;
          @property (nonatomic, strong) VideoModel *videoModel;
    • VideoCell.m
          @property (weak, nonatomic) IBOutlet UILabel *nameLabel;
          @property (weak, nonatomic) IBOutlet UILabel *teacherLabel;
          @property (weak, nonatomic) IBOutlet UILabel *timeLabel;
      
          - (void)setVideoModel:(VideoModel *)videoModel {
      
              _videoModel = videoModel;
      
              self.nameLabel.text = videoModel.name;
              self.teacherLabel.text = videoModel.teacher;
              self.timeLabel.text = [NSString stringWithFormat:@"%@", videoModel.length];
          }
    • ViewController.h
          @interface ViewController : UITableViewController
    • ViewController.m
          // 表格数据源数组
          @property (nonatomic, strong) NSArray *dataSourceArray;
      
          // 网络数据解析数据源
          @property (nonatomic, strong) NSMutableArray *videosSourceArray;
      
          // 数据模型
          @property (nonatomic, strong) VideoModel *videoModel;
      
          // 数据模型的值
          @property (nonatomic, strong) NSMutableString *videoModelElementValueString;
      
          // 设置数据源数据
      
              - (void)setDataSourceArray:(NSArray *)dataSourceArray {
                  _dataSourceArray = dataSourceArray;
      
                  // 刷新表格
                  [self.tableView reloadData];
      
                  // 停止刷新,刷新完成后必须调用停止刷新方法
                  [self.refreshControl endRefreshing];
              }
      
          // 懒加载
      
              - (NSMutableArray *)videosSourceArray {
                  if (_videosSourceArray == nil) {
                      _videosSourceArray = [[NSMutableArray alloc] init];
                  }
                  return _videosSourceArray;
              }
      
              - (NSMutableString *)videoModelElementValueString {
                  if (_videoModelElementValueString == nil) {
                      _videoModelElementValueString = [[NSMutableString alloc] init];
                  }
                  return _videoModelElementValueString;
              }
      
          // 表格数据源方法
      
              - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
                  return self.dataSourceArray.count;
              }
      
              - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
      
                  VideoCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
      
                  cell.videoModel = self.dataSourceArray[indexPath.row];
      
                  return cell;
              }
      
          // 下载解析数据
      
              // 连接到表格刷新控件
              - (IBAction)downloadData {
      
                  NSURL *url = [NSURL URLWithString:@"http://192.168.88.200/videos/videos.xml"];
                  NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:1 timeoutInterval:15.0];
                  NSURLSession *session = [NSURLSession sharedSession];
      
                  // 异步执行
                  NSURLSessionDataTask *task = [session dataTaskWithRequest:request
                                                          completionHandler:^(NSData * _Nullable data,
                                                                       NSURLResponse * _Nullable response,
                                                                             NSError * _Nullable error) {
      
                      if (error == nil && data != nil) {
                          NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
                          parser.delegate = self;
                          [parser parse];
                      }
                  }];
      
                  [task resume];
              }
      
              - (void)parserDidStartDocument:(NSXMLParser *)parser {
                  [self.videosSourceArray removeAllObjects];
              }
      
              - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
                                                      namespaceURI:(NSString *)namespaceURI
                                                     qualifiedName:(NSString *)qName
                                                        attributes:(NSDictionary *)attributeDict {
      
                  if ([elementName isEqualToString:@"video"]) {
                      self.videoModel = [[VideoModel alloc] init];
                      self.videoModel.videoId = @([attributeDict[@"videoId"] intValue]);
                  }
                  [self.videoModelElementValueString setString:@""];
              }
      
              - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
                  [self.videoModelElementValueString appendString:string];
              }
      
              - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
                                                    namespaceURI:(NSString *)namespaceURI
                                                   qualifiedName:(NSString *)qName {
      
                  if ([elementName isEqualToString:@"video"]) {
                      [self.videosSourceArray addObject:self.videoModel];
                  } else if (![elementName isEqualToString:@"videos"]) {
                      [self.videoModel setValue:self.videoModelElementValueString forKey:elementName];
                  }
              }
      
              - (void)parserDidEndDocument:(NSXMLParser *)parser {
      
                  // 主线程更新 UI
                  dispatch_async(dispatch_get_main_queue(), ^{
      
                      self.dataSourceArray = self.videosSourceArray;
                  });
              }   
时间: 2024-08-22 19:23:54

iOS - UIRefreshControl 刷新数据的相关文章

Swift开发之使用UIRefreshControl实现下拉刷新数据及uirefreshcontrol使用_Swift

想要下拉刷新表格数据,上拉加载新数据,网上有许多第三方的实现类. 而如果仅仅需要实现下拉刷新数据的话,那么使用 UIRefreshControl 就足够了,简单有好用. 1.UIRefreshControl 的使用步骤: (1)创建 UIRefreshControl,并设置文字,颜色等信息. (2)将 UIRefreshControl 添加到tableview视图中. (3)给 UIRefreshControl 添加方法,当值改变的时候调用,用于数据请求刷新. (4)请求数据确认完成之后,调用e

Swift开发之下拉刷新数据的功能实现(使用UIRefreshControl)

想要下拉刷新表格数据,上拉加载新数据,网上有许多第三方的实现类. 而如果仅仅需要实现下拉刷新数据的话,那么使用 UIRefreshControl 就足够了,简单有好用.   1,UIRefreshControl 的使用步骤: (1)创建 UIRefreshControl,并设置文字,颜色等信息. (2)将 UIRefreshControl 添加到tableview视图中. (3)给 UIRefreshControl 添加方法,当值改变的时候调用,用于数据请求刷新. (4)请求数据确认完成之后,调

图片-实现由无网络连上网络自动刷新数据

问题描述 实现由无网络连上网络自动刷新数据 安卓实现实现由无网络连上网络自动刷新数据 比如当前网络不稳定图片未加载出 网络恢复正常的时候自动 加载出图片 解决方案 http://www.cnblogs.com/renqingping/archive/2012/10/18/Net.html 定时轮询 解决方案二: 网络的变化都是发广播的,监听这个广播,再判断处理不得了... 解决方案三: 根据网络变化的广播,注册一个receiver,判断一个标志位 解决方案四: iOS平台利用 NSURLProt

IOS中JSON数据的解析

IOS中JSON数据解析 官方为我们提供的解析JSON数据的类是NSJSONSerialization,首先我们先来看下这个类的几个方法: + (BOOL)isValidJSONObject:(id)obj; 判断一个数据对象是否可以转化为JSON数据 + (NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error; 将JSON数据写为NSData数据,其中opt参数

listview-点击ListView中条目后,刷新数据又返回到另一个条目的数据页面,怎么解决

问题描述 点击ListView中条目后,刷新数据又返回到另一个条目的数据页面,怎么解决 "点击ListView中条目后,刷新数据又返回到另一个条目的数据页面,怎么解决" 解决方案 清除原数据 解决方案二: 点击ListView中条目后,刷新数据又返回到另一个条目的数据页面,怎么解决 没看明白,怎么叫"刷新数据又返回到另一个条目的数据页面"? 建议把问题描述清楚些 解决方案三: 你可能是把要加载的数据放在onStart()方法中了,自己写个方法 放在oncreate中

iOS开发系列--数据存取

概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储到数据库.例如前面IOS开发系列-Objective-C之Foundation框架的文章中提到归档.plist文件存储,包括偏好设置其本质都是存储为文件,只是说归档或者plist文件存储可以选择保存到沙盒中,而偏好设置系统已经规定只能保存到沙盒的Library/Preferences目录.当然,文件存储并不作为本文的重点内容.本文重点还是说数据库存储,做过数据库开发的朋友应该知道,可以通过SQL直接访问数据库,也可以

线程-关于UItableview刷新数据的问题

问题描述 关于UItableview刷新数据的问题 最近在搞即时聊天,发送图片的时候是发送url,存到数据库,然后发送完成后,刷新读取数据库,在cell加载URL图片,然而每次都是发送完成,不显示..重新进就显示了.. 试过主线程[tableview reloaddata],木有用. 求教大神 图片发送本地如何处理.. 解决方案 UITableView数据刷新 案例说明:点击对应的条目,然后弹出对话框,输入文字,可以修改对应条目的内容 如何做到刷新呢? 原理是修改我们的模型,跟listview一

android前台的textview怎么显示一个数组,并且定时刷新数据?

问题描述 android前台的textview怎么显示一个数组,并且定时刷新数据? 有一个数组,想把里面的数据定时在前台一个文本框显示,每次显示一个.代码要怎么弄啊??新手刚开始学安卓开发.求大神不要嫌弃. 解决方案 Handler handler = new Handler(); int i =0; Runnable runnable = new Runnable() { @Override public void run() { // handler自带方法实现定时器 try { handl

highchart实时刷新数据,x轴不显示所需时间

问题描述 highchart实时刷新数据,x轴不显示所需时间 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default1.aspx.cs" Inherits="HighchartsDemo._Default1" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional