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
时间: 2024-10-07 07:37:53

iOS 下拉刷新和加载更多 (OC\Swift)的相关文章

Android之RecyclerView轻松实现下拉刷新和加载更多

今天研究了下RecyclerView的滑动事件,特别是下拉刷新和加载更多事件,在现在几乎所有的APP显示数据列表时都用到了.自定义RecyclerView下拉刷新和加载更多听上去很复杂,实际上并不难,只要是对滑动事件的监听和处理. 一.自定义RecyclerView实现下拉刷新和加载更多 1.如何判断RecyclerView是在上滑还是下滑 在RecyclerView的OnScrollListener滑动事件监听中有个好用的方法,就是onScrolled(RecyclerView recycle

自己封装的工具类,使用原生SwipeRefreshLayout+RecycleView实现下拉刷新和加载更多

实现SwipeRefreshLayout+RecycleView实现刷新 在你的xml文件里写上如下代码: <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/SwipeRefreshLayout" android:layout_width="match_parent" android:layout_height="match_parent"> <andr

Android Demo 下拉刷新+加载更多+滑动删除

小伙伴们在逛淘宝或者是各种app上,都可以看到这样的功能,下拉刷新和加载更多以及滑动删除,刷新,指刷洗之后使之变新,比喻突破旧的而创造出新的,比如在手机上浏览新闻的时候,使用下拉刷新的功能,我们可以第一时间掌握最新消息,加载更多是什么nie,简单来说就是在网页上逛淘宝的时候,我们可以点击下一页来满足我们更多的需求,但是在手机端就不一样了,没有上下页,怎么办nie,方法总比困难多,细心的小伙伴可能会发现,在手机端中,有加载更多来满足我们的要求,其实加载更多也是分页的一种体现.小伙伴在使用手机版QQ

Android UI--自定义ListView(实现下拉刷新+加载更多)

http://blog.csdn.net/wwj_748/article/details/12512885 Android UI--自定义ListView(实现下拉刷新+加载更多) 关于实现ListView下拉刷新和加载更多的实现,我想网上一搜就一堆.不过我就没发现比较实用的,要不就是实现起来太复杂,要不就是不健全的.因为小巫近期要开发新浪微博客户端,需要实现ListView的下拉刷新,所以就想把这个UI整合到项目当中去,这里只是一个demo,可以根据项目的需要进行修改. 就不要太在乎界面了哈:

ios下拉刷新上拉加载EGORefresh简单实现

前提下载 EGORefreshTableHeaderView.h  EGORefreshTableHeaderView.mEGORefreshTableFootView.h     EGORefreshTableFootView.m  以及8张图片并拖入工程 在.pch文件里导入 #import "EGORefreshTableHeaderView.h" #import "EGORefreshTableFootView.h"在.h文件里 UIScrollViewDe

iOS下拉刷新和上拉刷新

在iOS开发中,我们经常要用到下拉刷新和上拉刷新来加载新的数据,当前这也适合分页.iOS原生就带有该方法,下面就iOS自带的下拉刷新方法来简单操作. 上拉刷新 1.在TableView里,一打开软件,我们就调用下拉刷新事件. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 - (void)viewDidLoad {     [super viewDidLoad];     // 集成刷新控件     [self set

iOS下拉刷新

在iOS开发中,我们经常要用到下拉刷新来加载新的数据.iOS原生就带有该方法,下面就iOS自带的下拉刷新方法来简单操作. 1.在TableView里,一打开软件,我们就调用下拉刷新事件. - (void)viewDidLoad { [super viewDidLoad]; // 集成刷新控件 [self setupRefresh]; } /** * 集成下拉刷新 */ -(void)setupRefresh { //1.添加刷新控件 UIRefreshControl *control=[[UIR

Android智能下拉刷新加载框架—看这些就够了

一些值得学习的几个下拉刷新上拉加载开源库 Android智能下拉刷新框架-SmartRefreshLayout 支持所有的 View(AbsListView.RecyclerView.WebView....View) 和多层嵌套的视图结构 支持自定义并且已经集成了很多炫酷的 Header 和 Footer (图). 支持和ListView的同步滚动 和 RecyclerView.AppBarLayout.CoordinatorLayout 的嵌套滚动 NestedScrolling. 支持在An

iOS:下拉刷新控件UIRefreshControl的详解

下拉刷新控件:UIRefreshControl 1.具体类信息: @interface UIRefreshControl : UIControl //继承控制类 - (instancetype)init; @property (nonatomic, readonly, getter=isRefreshing) BOOL refreshing; //是否可以刷新 @property (nonatomic, retain) UIColor *tintColor; //控件颜色 @property (