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