iOS 下拉刷新和加载更多 (OC\Swift)
Swift语言出来之后, 可能还没有第三方的下拉刷新和上提加载, 所以自己用UIRefreshControl控件和UITableView实例的tableFooterView(底部视图)属性结合起来写了一个下拉刷新和点击加载更多的基本实现, 分为OC的代码实现和Swift的代码实现, 希望大家可以指出不足:
Swift代码:
1 import UIKit 2 3 class ViewController: UITableViewController { 4 5 // 用于显示的数据源 6 var _dataSource:[String] = [] 7 8 // 加载更多 状态 风火轮 9 var _aiv:UIActivityIndicatorView! 10 11 override func viewDidLoad() { 12 super.viewDidLoad() 13 // Do any additional setup after loading the view, typically from a nib. 14 15 // 数据源中的基础数据 16 for i in 0...2 { 17 18 _dataSource.append("\(i)") 19 } 20 21 // 初始下拉刷新控件 22 self.refreshControl = UIRefreshControl() 23 self.refreshControl?.attributedTitle = NSAttributedString(string: "Pull To Refresh") 24 self.refreshControl?.tintColor = UIColor.greenColor() 25 self.refreshControl?.addTarget(self, action: "refresh", forControlEvents: .ValueChanged) 26 27 // 加载更多按扭的背景视图 28 var tableFooterView:UIView = UIView() 29 tableFooterView.frame = CGRectMake(0, 0, self.view.bounds.size.width, 44) 30 tableFooterView.backgroundColor = UIColor.greenColor() 31 self.tableView.tableFooterView = tableFooterView 32 33 // 加载更多的按扭 34 let loadMoreBtn = UIButton() 35 loadMoreBtn.frame = CGRectMake(0, 0, self.view.bounds.width, 44) 36 loadMoreBtn.setTitle("Load More", forState: .Normal) 37 loadMoreBtn.setTitleColor(UIColor.lightGrayColor(), forState: .Normal) 38 loadMoreBtn.addTarget(self, action: "loadMore:", forControlEvents: .TouchUpInside) 39 tableFooterView.addSubview(loadMoreBtn) 40 41 // 加载更多 状态 风火轮 42 _aiv = UIActivityIndicatorView(activityIndicatorStyle: .Gray) 43 _aiv.center = loadMoreBtn.center 44 tableFooterView.addSubview(_aiv) 45 } 46 47 // 加载更多方法 48 func loadMore(sender:UIButton) { 49 50 sender.hidden = true 51 _aiv.startAnimating() 52 53 dispatch_async(dispatch_get_global_queue(0, 0), { () -> Void in 54 55 self._dataSource.append("\(self._dataSource[self._dataSource.count-1].toInt()! + 1)") 56 57 dispatch_async(dispatch_get_main_queue(), { () -> Void in 58 59 sleep(1) 60 61 self._aiv.stopAnimating() 62 sender.hidden = false 63 64 self.tableView.reloadData() 65 }) 66 }) 67 } 68 69 // 下拉刷新方法 70 func refresh() { 71 72 if self.refreshControl?.refreshing == true { 73 74 self.refreshControl?.attributedTitle = NSAttributedString(string: "Loading...") 75 } 76 77 dispatch_async(dispatch_get_global_queue(0, 0), { () -> Void in 78 79 self._dataSource.insert("\(self._dataSource[0].toInt()! - 1)", atIndex: 0) 80 81 dispatch_async(dispatch_get_main_queue(), { () -> Void in 82 83 sleep(1) 84 85 self.refreshControl?.endRefreshing() 86 self.refreshControl?.attributedTitle = NSAttributedString(string: "Pull To Refresh") 87 88 self.tableView.reloadData() 89 }) 90 }) 91 } 92 93 // tableView dataSource 94 override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 95 96 return _dataSource.count 97 } 98 99 override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 100 101 let identifier = "cell" 102 103 var cell = tableView .dequeueReusableCellWithIdentifier(identifier) as? UITableViewCell 104 105 if cell == nil { 106 107 cell = UITableViewCell(style: .Default, reuseIdentifier: identifier) 108 } 109 110 cell?.textLabel?.text = "\(_dataSource[indexPath.row])" 111 112 return cell! 113 } 114 }
OC代码:
1 #import "ViewController.h" 2 3 @interface ViewController () 4 { 5 // 数据源 6 NSMutableArray * _dataSource; 7 8 // 风火轮 9 UIActivityIndicatorView * _aiv; 10 } 11 12 @end 13 14 @implementation ViewController 15 16 - (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 17 { 18 return self; 19 } 20 21 - (void)viewDidLoad { 22 [super viewDidLoad]; 23 // Do any additional setup after loading the view, typically from a nib. 24 25 // 初始数据源 26 _dataSource = [[NSMutableArray alloc] init]; 27 28 // 基础数据 29 for (int i=0; i<3; i++) { 30 31 [_dataSource addObject:[NSString stringWithFormat:@"%d",i]]; 32 } 33 34 // 刷新控件 35 self.refreshControl = [[UIRefreshControl alloc] init]; 36 self.refreshControl.attributedTitle = [[NSAttributedString alloc] initWithString:@"Pull To Refresh"]; 37 self.refreshControl.tintColor = [UIColor greenColor]; 38 [self.refreshControl addTarget:self action:@selector(refresh) forControlEvents:UIControlEventValueChanged]; 39 40 // 背景视图 41 UIView * tableFooterView = [[UIView alloc] init]; 42 tableFooterView.frame = CGRectMake(0, 0, self.view.bounds.size.width, 44); 43 tableFooterView.backgroundColor = [UIColor greenColor]; 44 self.tableView.tableFooterView = tableFooterView; 45 46 // 加载更多按扭 47 UIButton * loadMoreBtn = [[UIButton alloc] init]; 48 loadMoreBtn.frame = CGRectMake(0, 0, self.view.bounds.size.width, 44); 49 [loadMoreBtn setTitle:@"Load More" forState:UIControlStateNormal]; 50 [loadMoreBtn setTitleColor:[UIColor lightGrayColor] forState:UIControlStateNormal]; 51 [loadMoreBtn addTarget:self action:@selector(loadMore:) forControlEvents:UIControlEventTouchUpInside]; 52 [tableFooterView addSubview:loadMoreBtn]; 53 54 // 风火轮 55 _aiv = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; 56 _aiv.center = loadMoreBtn.center; 57 [tableFooterView addSubview:_aiv]; 58 } 59 60 // 加载更多方法 61 - (void)loadMore:(UIButton *)sender 62 { 63 sender.hidden = YES; 64 [_aiv startAnimating]; 65 66 dispatch_async(dispatch_get_global_queue(0, 0), ^{ 67 68 [_dataSource addObject: [NSString stringWithFormat:@"%d", [_dataSource[_dataSource.count-1] intValue] + 1]]; 69 70 dispatch_async(dispatch_get_main_queue(), ^{ 71 72 sleep(1); 73 74 [_aiv stopAnimating]; 75 sender.hidden = NO; 76 77 [self.tableView reloadData]; 78 }); 79 }); 80 } 81 82 // 下拉刷新方法 83 - (void)refresh { 84 85 if (self.refreshControl.refreshing) { 86 87 self.refreshControl.attributedTitle = [[NSAttributedString alloc] initWithString:@"Loading..."]; 88 } 89 90 dispatch_async(dispatch_get_global_queue(0, 0), ^{ 91 92 [_dataSource insertObject:[NSString stringWithFormat:@"%d", [_dataSource[0] intValue] -1] atIndex:0]; 93 94 dispatch_async(dispatch_get_main_queue(), ^{ 95 96 sleep(1); 97 98 [self.refreshControl endRefreshing]; 99 self.refreshControl.attributedTitle = [[NSAttributedString alloc] initWithString:@"Pull To Refresh"]; 100 101 [self.tableView reloadData]; 102 }); 103 }); 104 } 105 106 // tableView dataSource 107 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 108 109 return _dataSource.count; 110 } 111 112 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 113 114 static NSString * identifier = @"cell"; 115 116 UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:identifier]; 117 118 if (cell == nil) { 119 cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier]; 120 } 121 122 cell.textLabel.text = _dataSource[indexPath.row]; 123 124 return cell; 125 } 126 127 @end