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. 在config文件输入特殊字符

    今天遇到要在config文件中配置一个包含引号,尖括号的特殊字符的问题,config文件不支持转义字符,我开始发动自己的脑子想,想出一个蹩脚的方法,用其他的字符替换比如&,?,!,问题倒是解决 ...

  2. 14、C#基础整理(函数)

    函数 1.概念:是一个带有输入参数.输出参数.返回值的代码块. 2.写法: 修饰符  返回值类型  函数名(输入参数,输入参数) { 方法段 return 返回值; } 3.注释: (1)输入参数格式 ...

  3. asp.net mvc3.0第一个程序helloworld开发图解

    步骤一:新建asp.net mvc3.0项目 (选择Razor模板) 步骤二:创建控制器 步骤三:控制器源码内右键创建对应视图 步骤四:控制器内添加代码 步骤五:视图页面输出内容 步骤六:F5调试

  4. D - 排列

    #include<cstdio> #include<algorithm> #include<string.h> using namespace std; #defi ...

  5. rnn lstm

    资料收集:https://github.com/kjw0612/awesome-rnn 代码+例子+物理意义:https://iamtrask.github.io/2015/11/15/anyone- ...

  6. wireshark使用详解

    编号:1009时间:2016年4月29日15:52:44功能:wireshark使用详解URl:http://blog.jobbole.com/70907/URL:http://www.9upk.co ...

  7. php-多态

    <?php //面对对象三大特性//封装//目的:让类更安全//做法:成员变量变为私有的,通过方法来间接操作成员变量,在方法里面加限制条件 //继承//概念:子类可以继承父类的一切//方法重写: ...

  8. js实现分页列表添加样式

    <script> var dUrl=window.location.href; var cUrl=(dUrl.substring(0, dUrl.indexOf('list_'))); v ...

  9. GPIO模拟IIC接口信号质量分析

    信号质量有问题的波形001: 信号质量有问题的波形002: 从上图可以看出,GPIO口模拟的I2C接口,电平都存在半高的情况. 因为I2C的接口是通过GPIO模拟实现的,该时钟信号线SCL内部默认为下 ...

  10. clipToBounds

    最近在开发H5平台的iOS移动侧,遇到些问题,随手记录下来. 1 UIView的clipToBounds 窗口裁剪,默认是NO,表示如果父窗口的大小已经不足以显示子窗口,也不进行裁剪,而是显示,但这时 ...