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

Refresh1 Refresh2 Refresh3

  • 實例化刷新控件

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM