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

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

  1. RecyclerView的下拉刷新和加载更多 动画

    下拉刷新和加载更多 1.https://github.com/jianghejie/XRecyclerView 2.http://blog.csdn.net/jabony/article/detail ...

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

    今天研究了下RecyclerView的滑动事件,特别是下拉刷新和加载更多事件,在现在几乎所有的APP显示数据列表时都用到了.自定义RecyclerView下拉刷新和加载更多听上去很复杂,实际上并不难, ...

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

    实现SwipeRefreshLayout+RecycleView实现刷新 在你的xml文件里写上如下代码: <android.support.v4.widget.SwipeRefreshLayo ...

  4. RecyclerView 下拉刷新和加载更多

    一.SwipeRefreshLayout实现下拉刷新 1.方法API: setOnRefreshListener(OnRefreshListener):添加下拉刷新监听器 setRefreshing( ...

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

    Android UI--自定义ListView(实现下拉刷新+加载更多) 关于实现ListView下拉刷新和加载更多的实现,我想网上一搜就一堆.不过我就没发现比较实用的,要不就是实现起来太复杂,要不就 ...

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

    小伙伴们在逛淘宝或者是各种app上,都可以看到这样的功能,下拉刷新和加载更多以及滑动删除,刷新,指刷洗之后使之变新,比喻突破旧的而创造出新的,比如在手机上浏览新闻的时候,使用下拉刷新的功能,我们可以第 ...

  7. PullToRefresh下拉刷新 加载更多 详解 +示例

    常用设置 项目地址:https://github.com/chrisbanes/Android-PullToRefresh a. 设置刷新模式 如果Mode设置成Mode.PULL_FROM_STAR ...

  8. 分页插件思想:pc加载更多功能和移动端下拉刷新加载数据

    感觉一个人玩lol也没意思了,玩会手机,看到这个下拉刷新功能就写了这个demo! 这个demo写的比较随意,咱不能当做插件使用,基本思想是没问题的,要用就自己封装吧! 直接上代码分析下吧! 布局: & ...

  9. iOS 下拉刷新-上拉加载原理

    前言 讲下拉刷新及上拉加载之前先给大家解释UIScrollView的几个属性 contentSize是UIScrollView可以滚动的区域. contentOfinset 苹果官方文档的解释是&qu ...

随机推荐

  1. 步步入佳境---UI入门(4) --简单练习

    一,创建SingleViewApplication 1,UILabel的简单使用 UILabel *label=[[UILabel alloc]initWithFrame:CGRectMake(0, ...

  2. Inno_setup制作升级包必须面临的几个问题

    Inno_setup制作升级包必须面临的几个问题 分类: c/c++/GamingAnyWhere JavaScript linux shell基础知识 2013-12-18 22:14 1496人阅 ...

  3. NSIS

    NSIS 是“Nullsoft 脚本安装系统”(Nullsoft Scriptable Installation System) 的缩写,它是一个免费的 Win32 安装.卸载系统,采用了简洁高效的脚 ...

  4. Smart210---学习记录 竞态与并发

    竞态与并发 自旋锁 若一个进程要访问临界资源,测试锁空闲,则进程获得这个锁并继续执行:若测试结果表明锁扔被 占用,进程将在一个小的循环内重复“测试并设置”操作,进行所谓的“自旋”,等待自旋锁持有者释 ...

  5. 平衡二叉树(Balanced Binary Tree)

    平衡二叉树(Balanced Binary Tree)/AVL树:

  6. 快速用springmvc搭建web应用-超越昨天的自己系列(10)

    Demo地址:http://pan.baidu.com/s/1sjttKWd 创建命令: mvn archetype:generate -DgroupId=com.witown.open.demo - ...

  7. OOP初学小结

    最近刚刚开始学python的OOP,感觉不太适应.一些很简单的程序也卡了好半天才能调好- 其中的一个错误是:将两个不同的类的方法互相调用,结果走进死循环- 另外就是debug的时候,不要在那里空空地望 ...

  8. sdut 2159 Ivan comes again!(2010年山东省第一届ACM大学生程序设计竞赛) 线段树+离散

    先看看上一个题: 题目大意是: 矩阵中有N个被标记的元素,然后针对每一个被标记的元素e(x,y),你要在所有被标记的元素中找到一个元素E(X,Y),使得X>x并且Y>y,如果存在多个满足条 ...

  9. Map-API及详解

    常用API 类别 方法 增加 put.putAll 删除 remove.removeAll.clear 查询 get 取值 entrySet.keySet.values 长度 size 判断 cont ...

  10. 按Right-BICEP的测试用例

    测试方法:Right-BICEP 测试计划 1.Right-结果是否正确? 2.B-是否所有的边界条件都是正确的? 3.P-是否满足性能要求? 4.结果是否有符合要求的20道题目? 5.所得到的最大数 ...