开发者社区> QianChia> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

iOS - UIRefreshControl 刷新数据

简介: 前言 NS_CLASS_AVAILABLE_IOS(6_0) __TVOS_PROHIBITED @interface UIRefreshControl : UIControl 1、UIRefreshControl UITableViewController 自带刷新控件。
+关注继续查看

前言

    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 方式创建

Refresh1Refresh2Refresh3

  • 实例化刷新控件

        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;
                  });
              }   

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
IOS开发初体验
IOS开发初体验 搭建开发环境 不多说什么了,开发环境的搭建太简单了,上App Store搜索XCode下载就行了,说多了都是眼泪 创建第一个IOS项目——HolleIO...
428 0
iOS开发中打电话发短信等功能的实现
原文:iOS开发中打电话发短信等功能的实现 在APP开发中,可能会涉及到打电话、发短信、发邮件等功能。比如说,通常一个产品的“关于”页面,会有开发者的联系方式,理想情况下,当用户点击该电话号码时,能够自动的帮用户拨出去,就涉及到了打电话的功能。
934 0
iOS 开发中的争议(一)
iOS 开发中的争议(一) Mar 15th, 2015 打算分享一些有争议的话题,并且表达一下我的看法。这是该系列的第一篇,我想讨论的是:类的成员变量应该如何定义? 在 Objective-C 的语言的早期,类的私有成员变量是只能定义在 .h 的头文件里面的。
503 0
【iOS开发】@objc private class func 与 Selector
本文介绍在 Swift 中 使用 KVO 时,一些需要注意的事项,下面截取了两段我自己在项目中使用的代码。 self.timer = NSTimer.scheduledTimerWithTimeInterval(timeInterval, target...
626 0
[分享]错误“应用程序Xcode的这个版本不能与此版本的OS X配合使用”以及Mac源码和IOS开发资料分享
[分享]错误“应用程序Xcode的这个版本不能与此版本的OS X配合使用”以及Mac源码和IOS开发资料分享 安装Xcode时,出现“应用程序Xcode的这个版本不能与此版本的OS X配合使用”错误如下: 解决方案是: /system/libary/coreservice/SystemVersion.plist中的两个10.10为10.10.5 修改过程会提示无权限修改,要不要建立副本,点击提示框中的“复制”按钮,存到桌面上。
1297 0
iOS开发之XCode模拟器不能连接网络
新装的Xcode7 编译程序 出现 #warning: 获取app配置信息失败: The resource could not be loaded because the App Transport Security 我开始以为是xcode没优化好的缘故,其实这是苹果加大安全的管控,将以往HTTP协议强制改为HTTPS协议,以后的APP应该都是了,根本解决办法 改协议,临时解决办法在Info.
709 0
iOS开发UI篇—控制器的View的创建
iOS开发UI篇—控制器的View的创建 一、6种创建控制器View的方式 1 #import "NJAppDelegate.h" 2 #import "NJViewController.
387 0
+关注
QianChia
树的芳香由风决定,人生的芳香由自己决定!
文章
问答
文章排行榜
最热
最新
相关电子书
更多
深入剖析 iOS 性能优化
立即下载
React-Native 在iOS上的性能优化方案
立即下载
移动 App 性能监测实践(iOS篇)
立即下载