文档章节

iOS tableview用法

杭城小刘
 杭城小刘
发布于 2015/10/22 08:56
字数 1627
阅读 1740
收藏 0
点赞 0
评论 0

通过两种方法来实现: 

一、通过动态数组NSMutableArray中的数据,来显示数据

 

1.新建Empty Application项目,新建ViewController,HomeViewController,在AppDelegate.m中导入该文件,

并在方法- (BOOL)application:didFinishLaunchingWithOptions:中添加以下红色标记的代码

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];

    // Override point for customization after application launch.

    self.window.backgroundColor = [UIColor whiteColor];

    

    HomeViewController *homeViewController = [[HomeViewController alloc] init];

    self.window.rootViewController = homeViewController;

    [homeViewController release];

    

    [self.window makeKeyAndVisible];

    return YES;

 

2.在 HomeViewController.xib上添加Table View控件

将其Outlets的dataSource和delegate与File's Owner建立关联,

 目的:(1) dataSource: 向HomeViewController添加UITableViewDataSource协议,从而可以在该类中使用相关的协议方法,在Table View中显示数据。 

         (2) delegate :向HomeViewController添加UITableViewDelegate协议,从而可以在该类中使用相关的协议方法,响应用户在Table View中的交互操作。

 

 在HomeViewController.h中添加协议

#import <UIKit/UIKit.h>

@interface HomeViewController : UIViewController

<UITableViewDelegate, UITableViewDataSource>{

}

@end

目的:都添加协议,有备无患。提高代码编写的效率和可靠性。

 

3. 在HomeViewController.m中编写代码

 

#import "HomeViewController.h"

@interface HomeViewController ()

@end

@implementation HomeViewController

NSMutableArray *listOfContacts;//声明动态数组

- (void)viewDidLoad

{

 

    listOfContacts = [[NSMutableArray alloc] init];//分配内存并初始化

    

    [listOfContacts addObject:@"张三"];

    [listOfContacts addObject:@"张1"];

    [listOfContacts addObject:@"张2"];

    [listOfContacts addObject:@"张3"];

    [listOfContacts addObject:@"张4"];

    [listOfContacts addObject:@"张5"];

    [listOfContacts addObject:@"张6"];

    [listOfContacts addObject:@"张7"];

    [listOfContacts addObject:@"张8"];

    [listOfContacts addObject:@"张9"];

    [listOfContacts addObject:@"张11"];

    [listOfContacts addObject:@"张12"];

    [listOfContacts addObject:@"张13"];

    [listOfContacts addObject:@"张14"];

    [listOfContacts addObject:@"张15"];

    [listOfContacts addObject:@"张16"];

    [listOfContacts addObject:@"张17"];

    [listOfContacts addObject:@"张18"];

    [listOfContacts addObject:@"张19"];

    

    [super viewDidLoad];

}

//使用UITableViewDataSource协议的tableView:cellForRowAtIndexPath:方法

//该方法用来将数据填充进Table View的单元格中

/*

 在Table View中每填充一个单元格的数据就会触发一次该事件。

 注意:如果我们的数据一共有200项,并不代表会连续触发200次这个事件,如果当前屏幕只能显示10行数据的话,就只会触发10次该事件,当用户滚动该Table View而产生新的单元格时,才会继续触发该事件。

 */

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

    

    static NSString *CellIndentifier = @"Contact";

    

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIndentifier];

    /*

     dequeueReusableCellWithIdentifier方法,获取UITableViewCell类型的对象,而且获取的是一个已经在TableView中使用过并可以复用的对象。

     想象一下:

     如果数组中有1000个元素,我们为每一个元素都实例化一个UITableViewCell对象的话,系统就会内存溢出甚至崩溃。其实每个用户在一个屏幕中能够看到的单元格数量也就十几个,他们通过上下滚动屏幕的操作可以让一些已显示的单元格消除,而这些单元格对象系统就会保留下来以备我们需要显示新单元格时可以复用它们,从而达到了节省系统资源的目的。这个方法包含一个参数CellIdentifier, 它用于指明你需要哪个标识的可复用单元格。在同一界面中如果有多个表格的情况时非常有用。

     当然如果没有获取到可复用的单元格时,我们就需要使用UITableViewCell的initWithStyle:reuseIdentifier:方法直接实例化一个单元格。其中reuseIdentifier参数用于设置该表格的可复用标识。

     */

    

    if (cell == nil) {

        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIndentifier] autorelease];

        

    }

    

    NSString *cellValue = [listOfContacts objectAtIndex:indexPath.row];

    cell.textLabel.text = cellValue;

    

    //示意标志: Disclosure Indicator,Disclosure Button,Checkmark,默认为None

    //cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

    //cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;

    //cell.accessoryType = UITableViewCellAccessoryCheckmark;

    cell.accessoryType = UITableViewCellAccessoryNone;

    

    //单元格添加图片

    UIImage *image = [UIImage imageNamed:@"avatar.png"];

    cell.imageView.image = image;

    

    return cell;

}

//使用UITableViewDataSource协议的tableView:numberOfRowsInSection:方法

//该方法用来设置Table View中要显示数据的行数

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

    return [listOfContacts count];

}

//添加标题和脚本信息

- (NSString *tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{

      return @"联系人列表";

    

}

- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section{

    return @"作者:what if";

}

 

 

 

 //UITableViewDelegate协议的方法,选择表格中的项目

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

    NSString *contactSelected = [listOfContacts objectAtIndex:[indexPath row]];

    NSString *msg = [[NSString alloc] initWithFormat:@"您选择的联系人:%@", contactSelected];

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"选择联系人" message:msg delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];

    [alert show];

    [alert release];

    [contactSelected release];

    [msg release];

 //UITableViewDelegate协议的方法,表格中的缩进

- (NSIntegertableView:(UITableView *)tableView indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath{

    return [indexPath row] % 9;

    

}

- (void)dealloc{

 

    [listOfContacts release];

    [super dealloc];

    

}

- (void)viewDidUnload

{

    [super viewDidUnload];

}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

{

    return (interfaceOrientation == UIInterfaceOrientationPortrait);

}

@end

 

二、通过plist文件提供数据,来显示数据,方便分组

 1.添加contacts.plist文件

 2. 

HomeViewController.h中添加代码

#import <UIKit/UIKit.h>

@interface HomeViewController : UIViewController

<UITableViewDelegate, UITableViewDataSource>{

}

@property (nonatomic, retain) NSDictionary *contactTitles;//存储所有的联系人信息

@property (nonatomic, retain) NSArray *groups;//所有分类名称存入数组中

@end 

 

3HomeViewController.m中添加代码 


#import "HomeViewController.h"

@interface HomeViewController ()

@end

@implementation HomeViewController

@synthesize contactTitles;

@synthesize groups;

- (void)viewDidLoad

{

   

    NSString *path = [[NSBundle mainBundle] pathForResource:@"contacts" ofType:@"plist"];//plist文件路径

    NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:path];

    self.contactTitles = dict;

    [dict release];

    

    NSArray *array = [[contactTitles allKeys] sortedArrayUsingSelector:@selector(compare:)];

    

    self.groups = array;

    [super viewDidLoad];

}

//使用UITableViewDataSource协议的tableView:cellForRowAtIndexPath:方法

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

    

    static NSString *CellIndentifier = @"Contact";

    

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIndentifier];

    

    if (cell == nil) {

        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIndentifier] autorelease];

        

    }

    

    

       NSString *group = [groups objectAtIndex:[indexPath section]];

NSArray * contactSection = [contactTitles objectForKey:group];

cell.textLabel.text = [contactSection objectAtIndex:[indexPath row]];

    

    //单元格添加图片

    UIImage *image = [UIImage imageNamed:@"avatar.png"];

    cell.imageView.image = image;

    

    

    return cell;

}

- (NSInteger) numberOfSectionsInTableView:(UITableView *)tableView{

    return [groups count];

}

//使用UITableViewDataSource协议的tableView:numberOfRowsInSection:方法

//该方法用来设置Table View中要显示数据的行数

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

 

    NSString *group = [groups objectAtIndex:section];

    NSArray *contactSection = [contactTitles objectForKey:group];

    

    return [contactSection count];

}

//添加标题和脚本信息

- (NSString *) tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{

    NSString *group = [groups objectAtIndex:section];

    return group;

    

}

- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section{

    return @"作者:what if";

}


 

 

 /*//UITableViewDelegate协议的方法,选择表格中的项目

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

    NSString *contactSelected = [listOfContacts objectAtIndex:[indexPath row]];

    NSString *msg = [[NSString alloc] initWithFormat:@"您选择的联系人:%@", contactSelected];

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"选择联系人" message:msg delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];

    [alert show];

    [alert release];

    [contactSelected release];

    [msg release];

} */

/*

 //UITableViewDelegate协议的方法,表格中的缩进

- (NSInteger) tableView:(UITableView *)tableView indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath{

    return [indexPath row] % 9;

    

}*/

//索引功能 

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView{

    return groups;

}

//用户点击标志后触发的事件,只有DetailDisclosure Button才有该事件

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath{

    //进入到该项目的详细信息页面

 

 

- (void)dealloc{

    

    [contactTitles release];

    [groups release];

    [super dealloc];

    

}

- (void)viewDidUnload

{

    [super viewDidUnload];

}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

{

    return (interfaceOrientation == UIInterfaceOrientationPortrait);

}

@end

 

4.在xib文件中修改其Style为Grouped


 备注:

修改单元格的方法:

textLabel.font  使用UIFont设置单元格标签的字体

textLabel.lineBreakMode   使用UILineBreakMode指定单元格标签的文本如何换行

textLabel.text   将单元格标签的内容设置为一个NSString

textLabel.textAlignment   使用UITextAlignment设置单元格标签文本的对齐方式

textLabel.textColor    使用UIColor设置单元格标签文本的颜色

textLabel.selectedTextColor   使用UIColor设置选定文本的颜色

imageView.image   将单元格的图像视图设置为一个UIImage

imageView.selectedImage   将选定单元格的内容设置为UIImage


本文转载自:http://www.cnblogs.com/hanjun/archive/2012/10/28/2743309.html

共有 人打赏支持
杭城小刘
粉丝 14
博文 108
码字总数 47960
作品 0
杭州
iOS工程师
iOS三维菜单、调试工具、封装通讯录、网络框架、多种控件和动画等源码

iOS精选源码 一个调用系统通讯录和获取通讯录所有联系人的封装(http://www.code4app.com/thread-29726-1-1.html) ios scrollview嵌套tableview同向滑动(初级、进阶), 支持OC / Swift(http...

sunnyaigd ⋅ 05/15 ⋅ 0

iOS高仿QQ侧滑控件、下载框架、动画效果、扫一扫、颜色变化、K线图等源码

iOS精选源码 仿京东"加入购物车"转场动画(http://www.code4app.com/thread-28162-1-1.html) ColorTool(颜色转换)(http://www.code4app.com/thread-29256-1-1.html) Swift 专业版K线(http://w......

sunnyaigd ⋅ 04/17 ⋅ 0

iOS基础深入补完计划--NSURLSession使用详解(附Demo)

目录 前言 API Demo 前言 本文主要是把NSURLSession以及NSURLSessionTask相关的代理方法全部整理了一下。 旨在大体了解在一个iOS网络请求中、一个任务究竟经理了什么。 而我们、又能做些什么...

kirito_song ⋅ 05/10 ⋅ 0

Macaca App inspector

为方便更多用户查找界面元素,提供了同时支持 Android 和 iOS 平台的 Inspector 工具,此功能也是 Macaca 录制器的重要部分。另外,Web 元素查找请直接只用 。 Android iOS 安装 用法 更多用...

awesome@qa ⋅ 05/16 ⋅ 0

Appuploader的安装介绍

注意:下载AU后需安装java8运行环境才能启动;安装好了最新Java8运行环境,解压AU软件包,无需安装,Windows 64位系统点击appuploader.exe启动;如果是Linux/Windows 32位系统或Mac系统双击appuplo...

webmirror ⋅ 05/11 ⋅ 0

如何在iOS中构建实时用户的状态更新

在构建聊天应用程序时,看到朋友的列表和朋友的状态并不少见。像WhatsApp这样的应用程序具有此功能,检查您的朋友的状态非常有用,并知道在那时向他们发送消息是否明智。 我们将在一个虚构的...

菇哒微课 ⋅ 04/23 ⋅ 0

iOS逆向工程- 学习整理(工具详解)

前言 一、逆向工程的要求 具备丰富的 iOS 开发经验 最好能非常熟悉 iOS 设备的硬件构成,iOS 系统的运行原理。 拿到任意一个 App 之后能够大致推断出它的项目规模和使用的技术,比如它的MVC模...

_小迷糊 ⋅ 05/11 ⋅ 0

【AR】开始使用Vuforia开发iOS(2)

原 设置iOS开发环境 安装Vuforia iOS SDK 如何安装Vuforia iOS示例 编译并运行Vuforia iOS示例 支持iOS金属 iOS 64位迁移 设置iOS开发环境 适用于iOS的Vuforia引擎目前支持运行iOS 9及更高版...

lichong951 ⋅ 06/11 ⋅ 0

iOS渐变字体、动态条纹、获取特定位置cell、笔记App、购物车界面等源码

iOS精选源码 RAC实现添加购物车(http://www.code4app.com/thread-29956-1-1.html) 一个基于Photos.framework的图片多选,持续功能的更新中(http://www.code4app.com/thread-29959-1-1.html)...

sunnyaigd ⋅ 05/29 ⋅ 0

HDU ~ 6297 ~ CCPC直播 (模拟,输出格式控制)

思路:模拟就行了,注意Running和RTE的开头字母一样。 iomanip是I/O流控制头文件,就像printf的格式化输出一样。 以下是一些常用的: dec 置基数为10 相当于"%d" hex 置基数为16 相当于"%X" oc...

zscdst ⋅ 05/29 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

AppDelegate 设置Root相关

self.window = UIWindow.init(frame: UIScreen.main.bounds) self.window?.backgroundColor = UIColor.white self.window?.makeKeyAndVisible() self.window?.rootViewController = RootTabB......

west_zll ⋅ 28分钟前 ⋅ 0

Java并发系列5--倒计时器CountDownLatch

今天讲一个倒计时器工具,叫CountDownLatch。需要这个工具的场景大概有:当所有的小任务都完成之后,再启动大任务。 先看代码: public class CountDownLatchDemo {static final CountDow...

大大枣 ⋅ 30分钟前 ⋅ 0

SpreadJS使用进阶指南 - 使用 NPM 管理你的项目

前言 SpreadJS作为一款性能出众的纯前端电子表格控件,自2015年发布以来,已经被广泛应用于各领域“在线Excel”数据管理项目中。NPM,作为管理Node.js库最有力的手段,解决了很多NodeJS代码部...

葡萄城控件技术团队 ⋅ 31分钟前 ⋅ 0

Mac下IntelliJ IDEA快捷键大全

https://blog.csdn.net/lisongjia123/article/details/54949364

细节探索者 ⋅ 34分钟前 ⋅ 0

建造者模式

1、工厂模式中创建的对象大都是简单的对象 复杂的产品类并且拥有不同的属性特点的管理就需要用到建造者模式 2、建造者模式: 将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以...

职业搬砖20年 ⋅ 35分钟前 ⋅ 0

Mysql数据库开发 怎么优化SQL语句?

 1) 现场抓出慢查询语句 show full processlist;   2) 配置参数:   slow_query_log_file = ON 慢查询开启开关   long_query_time =2 记录大于2秒的sql语句   log_queries_not_usi...

老男孩Linux培训 ⋅ 35分钟前 ⋅ 0

Laravel 安装执行php artisan migrate 出现字段过长错误

最近在自己研究Laravel Laravel版本:5.6 PHP版本:7.1.9 Mysql版本:5.7.19 Apache版本:2.4.27 系统版本:windows10 首先要保证电脑安装了composer,和node.js 执行命令 composer global ...

Marhal ⋅ 40分钟前 ⋅ 0

ELK6.0日志从收集到处理完整版教程(二)

ELK简介 Elasticsearch 开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。也可以认为ElasticSearch是一...

bz_z ⋅ 43分钟前 ⋅ 0

Spark项目之电商用户行为分析大数据平台之(七)数据调研--基本数据结构介绍

目录 一、user_visit_action(Hive表) 1.1 表的结构 1.2 表的说明 二、user_info(Hive表) 2.1 表的结构 2.2 表的说明 三、task(MySQL表) 3.1 表的结构 3.2 表的说明 四、工作流程...

xiaomin0322 ⋅ 48分钟前 ⋅ 0

评分卡模型剖析之一(woe、IV、ROC、信息熵)

信用评分卡模型在国外是一种成熟的预测方法,尤其在信用风险评估以及金融风险控制领域更是得到了比较广泛的使用,其原理是将模型变量WOE编码方式离散化之后运用logistic回归模型进行的一种二...

火力全開 ⋅ 49分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部