软件设计中有设计模式,在UI设计方面也有设计模式。因为表视图的应用在iOS中极其普遍,本节向你们介绍表视图中两个UI设计模式:分页模式和下拉刷新(Pull-to-Refresh)模式。这两种模式已经成为移动平台开发的标准。ios
分页模式git
分页模式规范了移动平台进行大量数据请求的处理方式 。github
下拉刷新模式数据库
下拉刷新(Pull-to-Refresh)是从新刷新表视图或列表,从新加载数据,这种模式普遍用于移动平台。下拉刷新与分页相反,当翻动屏幕到 顶部时候,再往下拉屏幕程序就开始从新请求数据,表视图表头部分会出现等待指示器,请求结束表视图表头消失。下拉刷新模式带有箭头动画效果。编程
在不少开源社区中都有下拉刷新的实现代码,Github上的git://github.com/leah/PullToRefresh.git有一个下拉刷新的例子,能够供你们参考。设计模式
iOS6下拉刷新控件网络
随着下拉刷新模式影响力的愈来愈大,苹果不得不考虑把它列入本身的规范之中,并在iOS 6 API中推出了下拉刷新控件。iOS 6中的下拉刷新,有点像是在拉一个“胶皮糖”,当这个“胶皮糖”拉断的时候以后会出现等待指示器。ide
iOS 6 以后UITableViewController添加了一个refreshControl属性,这个属性保持了一个UIRefreshControl的对 象指针。UIRefreshControl就是iOS 6为表视图实现下拉刷新而提供的。UIRefreshControl类目前只能应用于表视图画面,其它视图不能使用。该属性与 UITableViewController配合使用,关于下拉刷新布局等问题能够没必要考虑,UITableViewController会将其自动放置 于表视图中。布局
咱们经过一个例子来了解一下UIRefreshControl控件的使用。参考建立简单表视图的案例,建立工程“RefreshControlSample”,而后修改代码ViewController.h。动画
- #import <UIKit/UIKit.h>
- @interface ViewController : UITableViewController
- @property (nonatomic,strong) NSMutableArray* Logs;
- @end
Logs属性存放了NDate日期列表,用于在表视图中显示须要的数据,ViewController.m中的初始化代码以下:
- - (void)viewDidLoad
- {
- [super viewDidLoad];
- //初始化变量和时间
- self.Logs = [[NSMutableArray alloc] init];
- NSDate *date = [[NSDate alloc] init];
- [self.Logs addObject:date];
- //初始化UIRefreshControl
- UIRefreshControl *rc = [[UIRefreshControl alloc] init];
- rc.attributedTitle = [[NSAttributedString alloc]initWithString:@”下拉刷新”];
- [rc addTarget:self action:@selector(refreshTableView) forControlEvents:UIControlEventValueChanged];
- self.refreshControl = rc;
- }
viewDidLoad方法中初始化了一条当前时间的模拟数据。UIRefreshControl的构造方式是init。 attributedTitle属性用于下拉控件显示标题文本。UIRefreshControl的addTarget: forControlEvents:方法可以经过编程方式为UIControlEventValueChanged事件添加处理方法。 refreshTableView是UIControlEventValueChanged事件的处理方法,refreshTableView方法的代码 以下:
- -(void) refreshTableView
- {
- if (self.refreshControl.refreshing) {
- self.refreshControl.attributedTitle = [[NSAttributedString alloc]initWithString:@”加载中…”];
- //添加新的模拟数据
- NSDate *date = [[NSDate alloc] init];
- //模拟请求完成以后,回调方法callBackMethod
- [self performSelector:@selector(callBackMethod:) withObject:date afterDelay:3];
- }
- }
UIRefreshControl的refreshing属性能够判断控件是否还处于刷新中的状态,刷新中状态的图标是咱们常见的等待指示器,在这 个阶段要将显示标题文本设置为“加载中…”。接下来应该是进行网络请求或者数据库查询的操做。这些操做完成后应用会回调callBackMethod方 法,本案例涉及云端的技术,咱们使用[self performSelector:@selector(callBackMethod:) withObject:date afterDelay:3]语句延时调用callBackMethod方法来模拟实现。
回调方法callBackMethod:的代码以下。
- -(void)callBackMethod:(id) obj
- {
- [self.refreshControl endRefreshing];
- self.refreshControl.attributedTitle = [[NSAttributedString alloc]initWithString:@”下拉刷新”];
- [self.Logs addObject:(NSDate*)obj];
- [self.tableView reloadData];
- }
在请求完成的时候endRefreshing方法能够中止下拉刷新控件,回到初始状态,显示的标题文本为“下拉刷新”。[self.tableView reloadData]语句是从新加载表视图。
实现UITableViewDataSource的两个方法代码以下:
- - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
- return 1;
- }
- - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
- return [self.Logs count];
- }
- - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
- static NSString *CellIdentifier = @”Cell”;
- UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
- if (cell == nil) {
- cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier];
- }
- NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
- [dateFormat setDateFormat: @"yyyy-MM-dd HH:mm:ss zzz"];
- cell.textLabel.text = [dateFormat stringFromDate: [self.Logs objectAtIndex:[indexPath row]]];
- cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
- return cell;
- }