这一篇记录的是iOS开发中UITableView的使用,iOS中的UITableView跟Android中的ListView特别相似,以下用一个Demo来说明:

1、Xcode中新建projectTestSimpleTableViewproject

2、在Main.storyboard中拖入一个UITableView控件

3、在ViewController.h文件里,实现UITableViewDelegate和UITableViewDataSource协议

这里须要说下的是。为了给UITableView填充数据,须要让ViewController实现这两个协议,类似于Android中给ListView填充数据。须要为ListView指定一个Adapter,然后重写Adapter中的某些方法,iOS中也是一样的,实现了上面这两个协议后,须要实现这两个协议中的某些方法,才干为UITableView加入数据。

ViewController.h文件的代码例如以下:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>

//界面中的UITableView控件
@property (weak, nonatomic) IBOutlet UITableView *tableView; //UITableView中的数据,用一个字符串数组来保存
@property (strong, nonatomic) NSMutableArray *tableDataArr; @end

为了将ViewController.h中声明的tableView变量,跟Main.storyboard中的UITableView控件联系起来,须要在Main.storyboard中做一些处理,例如以下图所看到的:

用鼠标右键点击Main.storyboard界面中的ViewController小圆钮,然后将Outlets中的tableView拖到面板中的UITableView控件上。这样就将变量和控件建立起联系了。

和Android中不同的是,要将变量和布局文件里的控件建立联系。我们是使用findViewById方法,通过控件的ID找到相应的控件。

4、以下须要在ViewController.m文件里,处理一些数据,首先须要在viewDidLoad方法里载入几条測试的数据。代码例如以下:

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
//在这里载入一些数据。用于显示在UITableView上面
[self loadData];
} #pragma mark 载入一些数据,用于显示在UITableView上
- (void)loadData {
//初始化数组
self.tableDataArr = [NSMutableArray array];
//加入20个字符串到数组中
for(int i = 0; i < 20; i++) {
[self.tableDataArr addObject:[NSString stringWithFormat:@"table item %i", i]];
}
}

这里是直接用循环生成了20条TableView数据。

5、实现UITableViewDataSource中的两个方法:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section   和

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

代码例如以下:

<span style="font-size:14px;">#pragma mark 该方法返回UITableView中的item个数
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [self.tableDataArr count];
} #pragma mark 该方法返回UITableView中每一个单元格,在这里处理每一个单元格中该显示什么数据
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
//从队列中取出单元格
UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:identifier forIndexPath:indexPath];
//为单元格的label设置数据
cell.textLabel.text = [self.tableDataArr objectAtIndex:indexPath.row];
return cell;
}</span>

这里的identifier是我们定义在方法外部的一个静态变量:

static NSString *identifier =@"TableViewCell";

这个变量的作用,就类似于Android中给一个ListItem设置tag,主要是为了重用TableViewCell而为单元格指定一个标识,通过这个标识就能找到单元格。

6、到这里代码基本上就写完了,可是UITableView怎么知道该从哪里获取数据呢。在Android中为ListView指定数据,须要写一个适配器Adapter,然后调用ListView的setAdapter方法指定数据,在iOS中为UITableView指定数据,能够在Main.storyboard中,鼠标右键放到UITableView上面。然后拖拉到ViewController小圆钮上面,例如以下图所看到的:

然后松开鼠标右键,在出现的对话框中选择dataSource。再反复一次上面的过程,选择delegate。这样就给UITableView设置了数据源和托付,托付主要用来处理UITableView的点击等事件,实现了托付中的某些方法就可以处理这些事件。

除了使用上面的操作方式为UITableView指定数据源之外。还能够直接在代码中设置UITableView的数据源,能够在viewDidLoad方法中增加以下两行代码:

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
//在这里载入一些数据,用于显示在UITableView上面
[self loadData];
//不在Main.storyboard中设置数据源和托付的话,就用以下两行代码设置TableView的数据源和托付
self.tableView.delegate = self;
self.tableView.dataSource = self;
}

7、假设这时候直接执行应用的话,会报错例如以下:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'unable to dequeue a cell with identifier TableViewCell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard'

原因是我们没有为UITableView指定单元格,还缺少以下一步:

在Main.storyboard中拖一个TableViewCell控件到UITableView上面,例如以下图所看到的:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">



然后选中这个TableViewCell,在右側配置这个TableViewCell的标识,例如以下图所看到的:

注意这里填写的identifier要跟我们定义在代码中的那个identifier一致。这样才干正确载入UITableView,再次执行应用程序后。结果例如以下所看到的:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

这里应该是有切割线的,可能在模拟器上显示不出来,所以在上图中没有显示出切割线。

8、给每一个单元格加上一个图片,这里能够通过以下的方法来给project加入一个图片:



然后在

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath
*)indexPath 方法中增加设置图片的代码例如以下所看到的:

#pragma mark 该方法返回UITableView中每一个单元格。在这里处理每一个单元格中该显示什么数据
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
//从队列中取出单元格
UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:identifier forIndexPath:indexPath];
//为单元格的label设置数据
cell.textLabel.text = [self.tableDataArr objectAtIndex:indexPath.row];
//为单元格设置一个图片
cell.imageView.image = [UIImage imageNamed:@"icon.png"];
return cell;
}

这样就能够给单元格加上图片了,效果例如以下图所看到的:

9、假设想给单元格加上一个側滑删除的功能,须要实现协议中的一个方法:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle
forRowAtIndexPath:(NSIndexPath *)indexPath

然后在这种方法中增加删除的代码例如以下:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
[self.tableDataArr removeObjectAtIndex:indexPath.row];
[self.tableView reloadData];
}

增加上面的代码后就可以实现側滑删除的功能了。

iOS开发之UITableView的使用的更多相关文章

  1. iOS开发之UITableView使用总结

    什么是UITableView 在众多移动应用中,能看到各式各样的表格数据 在iOS中,要实现表格数据展示,最常用的做法就是使用UITableView UITableView继承自UIScrollVie ...

  2. iOS开发之UITableView及cell重用

    1.UITanleview有的两种风格 一种是Plain,一种是Grouped,可以从这里设置风格: 他们样式分别如下: Plain: Grouped: 2.tableView展示数据的过程: (1) ...

  3. iOS开发之UITableView中计时器的几种实现方式(NSTimer、DispatchSource、CADisplayLink)

    最近工作比较忙,但是还是出来更新博客了.今天博客中所涉及的内容并不复杂,都是一些平时常见的一些问题,通过这篇博客算是对UITableView中使用定时器的几种方式进行总结.本篇博客会给出在TableV ...

  4. 李洪强iOS开发之RunLoop的原理和核心机制

    李洪强iOS开发之RunLoop的原理和核心机制 搞iOS之后一直没有深入研究过RunLoop,非常的惭愧.刚好前一阵子负责性能优化项目,需要利用RunLoop做性能优化和性能检测,趁着这个机会深入研 ...

  5. iOS开发之Socket通信实战--Request请求数据包编码模块

    实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数 据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncS ...

  6. iOS开发之UISearchBar初探

    iOS开发之UISearchBar初探 UISearchBar也是iOS开发常用控件之一,点进去看看里面的属性barStyle.text.placeholder等等.但是这些属性显然不足矣满足我们的开 ...

  7. iOS开发之UIImage等比缩放

    iOS开发之UIImage等比缩放 评论功能真不错 评论开通后,果然有很多人吐槽.谢谢大家的支持和关爱,如果有做的不到的地方,还请海涵.毕竟我一个人的力量是有限的,我会尽自己最大的努力大家准备一些干货 ...

  8. iOS开发之 Xcode6 添加xib文件,去掉storyboard的hello world应用

    iOS开发之  Xcode6.1创建仅xib文件,无storyboard的hello world应用 由于Xcode6之后,默认创建storyboard而非xib文件,而作为初学,了解xib的加载原理 ...

  9. iOS开发之loadView、viewDidLoad及viewDidUnload的关系

    iOS开发之loadView.viewDidLoad及viewDidUnload的关系 iOS开发之loadView.viewDidLoad及viewDidUnload的关系    标题中所说的3个方 ...

随机推荐

  1. CXF和Axis2开发webservice也是可以添加asmx等后缀

    在当家互联网时代, 手机APP所需要的后台服务接口经常会变化, 如果前期没有设计好, 把它们的请求地址配置在比较稳定不会经常修改的地址(例如专门一个后台服务用于获取所有最新的数据服务地址)这样不会因为 ...

  2. 扩展gcd codevs 1213 解的个数

    codevs 1213 解的个数  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题目描述 Description 已知整数x,y满足如下面的条件: ax+by ...

  3. 第一章 -- Java性能调优概述

    写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------主要内容包括: 1.概述 2 ...

  4. 同步IO与同步非阻塞IO的理解

    本文图片均来自网络 一.同步IO---Blocking IO 在Blocking IO模型中,用户空间的应用程序执行一个系统调用(recvform),这会导致应用程序阻塞,直到数据准备好,并且将数据从 ...

  5. [转]Android网格视图(GridView)

    GridView的一些属性: 1.android:numColumns=”auto_fit”   //GridView的列数设置为自动,也可以设置成2.3.4…… 2.android:columnWi ...

  6. g++ 链接*.a静态库 方法

    g++在链接*.a静态库时,直接作为object使用,不需要使用-l ,但是需要注意调整顺序,被依赖的文件放在后面. 如: g++  -g  -o0 -Wno-deprecated  -I$(INCL ...

  7. linux shell 正则表达式(BREs,EREs,PREs)差异比较(转,当作资料查)

    转载: 在计算机科学中,是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串.在很多文本编辑器或其他工具里,正则表达式通常被用来检索和/或 替换那些符合某个模式的文本内容.许多程序设计语 ...

  8. Apache下error.log文件太大的处理

    偶尔发现Apache下的错误日志非常的大,有4G多,先停止Apache服务的所有进程,最简单就是输命令:net stop apache2.2,然后删除 Apache2/logs/目录下的 error. ...

  9. mysql DATE_FORMAT(date, format) 函数

    DATE_FORMAT(date, format) 函数用法 DATE_FORMAT(date, format) 函数根据format字符串格式化date值. 1.把字符串转为日期格式 实例: SEL ...

  10. XHTML学习要点

    目标 掌握XHTML语法,能正确书写出符合规则的文档. 要点 基本概念,与HTML有什么不一样 基本语法规则: XHTML 文档必须拥有一个根元素 标签名.属性名称必须小写 属性值必须加引号 属性不能 ...