iOS开发之UITableView的使用

这一篇记录的是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" >

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

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

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

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

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];
}

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

时间: 2024-08-06 16:04:47

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

iOS开发之UITableView全面解析

在iOS开发中UITableView可以说是使用最广泛的控件,我们平时使用的软件中到处都可以看到它的影子,类似于微信.QQ.新浪微博等软件基本上随处都是UITableView.当然它的广泛使用自然离不开它强大的功能,今天这篇文章将针对UITableView重点展开讨论.今天的主要内容包括: 1.基本介绍 2.数据源 3.代理 4.性能优化 5.UITableViewCell 6.常用操作 7.UITableViewController 8.MVC模式   基本介绍 UITableView有两种风

IOS开发之UITableView使用大全。

前言: UITableView是ios开发中最常用的控件之一,几乎所有的应用都要用到,tableview继承UIScrollView,因此它不仅可以显示多行数据,而且具有scrollview的一些操作功能,比如滑动,自动偏移等等,因此非常强大. 而且tableview采用了数据源模式,因此只需要更改它的数据源,即可实现tableview显示数据的变化,而且tableviewcell还具有复用性. 所以tableview是一个在显示大量数据时及其好的选择. 1. tableview采用的是代理模式

iOS开发之UITableView使用总结

什么是UITableView 在众多移动应用中,能看到各式各样的表格数据 在iOS中,要实现表格数据展示,最常用的做法就是使用UITableView UITableView继承自UIScrollView,因此支持垂直滚动,而且性能极佳 UITableView的两种样式 UITableViewStylePlain UITableViewStyleGrouped tableView展示数据的过程 1.调用数据源的下面方法得知一共有多少组数据 - (NSInteger)numberOfSections

iOS开发之UITableView及cell重用

1.UITanleview有的两种风格 一种是Plain,一种是Grouped,可以从这里设置风格: 他们样式分别如下: Plain: Grouped: 2.tableView展示数据的过程: (1)首先,控制器要遵守UITableViewDataSource协议 @interface ViewController () <UITableViewDataSource> (2)调用数据源的下面方法得知一共有多少组数据 - (NSInteger)numberOfSectionsInTableVie

IOS开发之UITableView的奇技

作者:Biaoac age:保密 sex:直男 性格:低调沉稳,乖张内涵 博客背景:之前一直在使用UITableView,但是一直都只是初识,后来在不断的使用中找到了很多之前没有在意的东西,遂整理出来,当然,有很多还是看别人的博客中提到的点,我把他重踩一遍: 1.点击的时候显示选中状态,但状态一直村在,必须在点击下一个的时候取消选中状态 点击cell的时候调用 - (void)tableView:(UITableView )tableView didSelectRowAtIndexPath:(N

4、iOS 开发之 UITableView

一.UITableView的创建 表格控件在创建时必须指定样式,只能使用以下实例化方法 [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStyleGrouped]; UITableView的两种样式 1> UITableViewStylePlain 2> UITableViewStyleGrouped 2.UITableView的常见属性 // 头部视图(广告) @property (nonatomic,

IOS开发之UITableView

UITableView就相当于android中的listview,在这里先介绍一个简单的UItableView的用法,因为我也是刚学.而且也遇到了一些问题.直接上代码吧 这是ViewController.h  #import <UIKit/UIKit.h> @interface ViewController : UIViewController<UITableViewDataSource,UITableViewDelegate> @property (nonatomic,retai

iOS开发之UITableView的滚动优化以及隐藏特性的使用

郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 如果文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额随意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源码下载:点我传送 游戏官方下载:http://dwz.cn/RwTjl 游戏视频预览:http://dwz.cn/RzHHd 游戏开发博客:http://dwz.cn/RzJzI 游戏源码传送:http://dwz.cn/Nret1 影响 UITableView 滚动的流畅性的原因 1. 在代理方法中做了过多的计算占用了 UI

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

李洪强iOS开发之RunLoop的原理和核心机制 搞iOS之后一直没有深入研究过RunLoop,非常的惭愧.刚好前一阵子负责性能优化项目,需要利用RunLoop做性能优化和性能检测,趁着这个机会深入研究了RunLoop的原理和特性. RunLoop的定义 当有持续的异步任务需求时,我们会创建一个独立的生命周期可控的线程.RunLoop就是控制线程生命周期并接收事件进行处理的机制. RunLoop是iOS事件响应与任务处理最核心的机制,它贯穿iOS整个系统. Foundation: NSRunLo