iOS开发-UI (八)TableView

知识点:

1.UITableView使用

2.UITableView分段功能

3.UITableViewCell重用机制

=======================

UITableView使用

1.UITableView作用

2.UITableView创建

- (id)initWithFrame:(CGRect)frame style:(UITableViewStyle)style;

UITableViewStyle:

UITableViewStylePlain       列表模式

UITableViewStyleGrouped       分组模式

// 实例化一个表格视图

//UITableViewStylePlain 列表模式

//UITableViewStyleGrouped 分组模式

UITableView *tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStyleGrouped];

    //设置代理

    tableView.delegate = self;

    tableView.dataSource = self;

    [self.view addSubview:tableView];

3.UITableView关联数据(上面)

1)tableView通过代理关联数据

4.NSIndexPath

主要用来标识当前cell的在tableView中的位置

该对象有section和row两个属性,

前者标识当前cell处于第几个section中

后者代表在该section中的第几行

5.UITableViewCell介绍

1)创建方式

- (id)initWithStyle:(UITableViewCellStyle)style

reuseIdentifier:(NSString *)reuseIdentifier

//当某一个视图控制器受到导航控制器管理的时候,如果在self.view之上添加的第一个子视图是UIScrollView或者UIScrollView的子类,那么这个对象的坐标会自动往下偏移64个单位

//关闭此优化机制

//self.automaticallyAdjustsScrollViewInsets = NO;

UITableViewCellStyle:

UITableViewCellStyleDefault

UITableViewCellStyleValue1

UITableViewCellStyleValue2

UITableViewCellStyleSubtitle

UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];

=======================

UITableView分段功能

1.设置tableView的样式

UITableViewStyleGrouped

2.设置代理

1)设置段数:默认返回1

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

=======================

UITableView常用方法

UITableViewDataSource

UITableViewDelegate

@interface RootViewController ()<UITableViewDelegate,UITableViewDataSource>

 #pragma mark- UITableViewDelegate&UITableViewDataSource

//返回组数 (可选实现)

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

        return 2;

}

//返回一组里面有几行(默认为1组)

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

return 20;

}

//每一行都需要返回一个UITableViewCell类型的对象

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

//NSIndexPath 表格视图中的坐标对象

// section->组

// row->行

//创建UITableViewCell类型的对象

/*

参数1:cell的类型

参数2:复用标识

*/

UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];

//设置cell的标题为

cell.textLabel.text = @"大家好";

//设置图片

cell.imageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"%03ld", indexPath.section * 20 + indexPath.row + 1]];

return cell;

}

1)设置行高

- (CGFloat)tableView:(UITableView *)tableView

heightForRowAtIndexPath:(NSIndexPath *)indexPath

//设置行高

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    return 100;
}

2)设置段头标题

- (NSString *)tableView:(UITableView *)tableView

titleForHeaderInSection:(NSInteger)section

//返回组头标题

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
    return [NSString stringWithFormat:@"第%ld组组头",section];
}

3)设置段尾标题

- (NSString *)tableView:(UITableView *)tableView

titleForFooterInSection:(NSInteger)section

//返回组尾标题

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

    return @"我是组尾";

}

4)删除/插入一行(两个一起用)

//编辑事件的回调方法

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

    if (editingStyle == UITableViewCellEditingStyleDelete) {

        //删除

        //首先删除数据源

        [self.dataArr removeObjectAtIndex:indexPath.row];

        //刷新UI

        //reloadData 重新加载一遍数据

        //[_tableView reloadData];

        //带动画刷新(删除)

        [_tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationRight];

    }else{

        //插入
        //首先在数据源当中插入新数据

        [self.dataArr insertObject:@"西安" atIndex:indexPath.row];

        //刷新UI

        //[_tableView reloadData];

        //带动画刷新(插入)

        [_tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationRight];
    }
}

//返回的编辑类型

-(UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{

    /*

     UITableViewCellEditingStyleDelete //删除

     UITableViewCellEditingStyleInsert  //插入

     */

    //return UITableViewCellEditingStyleDelete;

    return UITableViewCellEditingStyleInsert;

}

5)定制删除上面的文字

- (NSString *)tableView:(UITableView *)tableView  titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath

//tableView调用

- (void)insertRowsAtIndexPaths:(NSArray *)indexPaths

withRowAnimation:(UITableViewRowAnimation)animation;

- (void)deleteRowsAtIndexPaths:(NSArray *)indexPaths

withRowAnimation:(UITableViewRowAnimation)animation;

6)进入编辑和取消编辑模式

@property(nonatomic,getter=isEditing) BOOL editing

7)如何让指定行可以编辑

- (BOOL)tableView:(UITableView *)tableView

canEditRowAtIndexPath:(NSIndexPath *)indexPath

 //是否允许编辑

-(BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath{

    //第一行不允许编辑例子

    /*

    if (indexPath.row == 0) {

        return NO;

    }

     */
    return YES;
}

8)如何做索引

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

  //返回索引

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

    NSMutableArray *newArr = [NSMutableArray new];

    //注意:索引的数量应该跟组数相等,如果索引的数量大于组数,则剩余的索引将无效

    for (char i  = ‘A‘; i <= ‘Z‘; i++) {

        [newArr addObject:[NSString stringWithFormat:@"%c组",i]];
    }
    return newArr;

}

9)如何跳转到指定某一段某一行

- (void)scrollToRowAtIndexPath:(NSIndexPath *)indexPath

atScrollPosition:(UITableViewScrollPosition)scrollPosition

animated:(BOOL)animated;

10)如何移动一行

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)

sourceIndexPath toIndexPath: (NSIndexPath *)destinationIndexPath{

//移动某一行

-(void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath{

    //sourceIndexPath 初始行数

    //destinationIndexPath 目标行数

  //保存一份

    id obj = self.dataArr[sourceIndexPath.row];
    //删除

    [self.dataArr removeObjectAtIndex:sourceIndexPath.row];

    //插入到目标位置
    [self.dataArr insertObject:obj atIndex:destinationIndexPath.row];

    for (NSString *str in self.dataArr) {

        NSLog(@"str = %@",str);
    }
}

11)选中指定行

- (void)tableView:(UITableView *)tableView

didSelectRowAtIndexPath:(NSIndexPath *)indexPath;

//选中某一行

//didSelectRowAtIndexPath   正确

//didDeselectRowAtIndexPath 错误

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

    NSLog(@"选中的行数为%ld",indexPath.row);

    /*

     UITableViewScrollPositionTop 移动某一行到屏幕的顶部

     UITableViewScrollPositionMiddle 移动某一行到屏幕的中间

     UITableViewScrollPositionBottom 移动某一行到屏幕的底部

     */

    [tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
}

12)处理accessoryButton按下的事件

- (void)tableView:(UITableView *)tableView

accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath

=======================

UITableViewCell复用机制

1.cell重用方式

- (id)dequeueReusableCellWithIdentifier:(NSString *)identifier;

2.复用的问题

第一次dequeue的时候可能还不存在该cell,所以需要判断

如果队列中没有该cell的话,则需要alloc一个

#pragma mark- UITableViewDelegate&UITableViewDataSource

//返回一组里面有几行(默认为1组)

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

    return 20;

}

//每一行都需要返回一个UITableViewCell类型的对象

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

    //在每一个UITableView当中,都会拥有一个复用队列(数组),每当需要返回一个UITableViewCell类型的对象的时候,首先去复用队列里面查找是否拥有相同类型的对象,如果有,就拿出来再次使用

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];

    //如果复用队列当中没有找到,就创建新对象

    if (cell == nil) {

        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];

    }
    NSLog(@"修改前显示的内容为%@",cell.textLabel.text);

    //设置cell的标题为

    cell.textLabel.text = [NSString stringWithFormat:@"%ld行",indexPath.row + 1];
    NSLog(@"修改后显示的内容为%@",cell.textLabel.text);
    return cell;

}
时间: 2024-12-11 00:01:42

iOS开发-UI (八)TableView的相关文章

iOS开发UI篇-tableView在编辑状态下的批量操作(多选)

先看下效果图 直接上代码 #import "MyController.h" @interface MyController () { UIButton *button; } @property(nonatomic,strong)NSMutableArray *array;//数据源 @property (nonatomic,strong)NSMutableArray *selectorPatnArray;//存放选中数据 @end @implementation MyControlle

iOS开发UI篇—使用嵌套模型完成的一个简单汽车图标展示程序

iOS开发UI篇—使用嵌套模型完成的一个简单汽车图标展示程序 一.plist文件和项目结构图 说明:这是一个嵌套模型的示例 二.代码示例: YYcarsgroup.h文件代码: // // YYcarsgroup.h // 07-汽车展示(高级) // // Created by apple on 14-5-28. // Copyright (c) 2014年 itcase. All rights reserved. // #import <Foundation/Foundation.h> @

iOS开发UI篇—实现UItableview控件数据刷新

iOS开发UI篇—实现UItableview控件数据刷新 一.项目文件结构和plist文件 二.实现效果 1.说明:这是一个英雄展示界面,点击选中行,可以修改改行英雄的名称(完成数据刷新的操作). 运行界面: 点击选中行: 修改数据后自动刷新: 三.代码示例 数据模型部分: YYheros.h文件 // // YYheros.h // 10-英雄展示(数据刷新) // // Created by apple on 14-5-29. // Copyright (c) 2014年 itcase. A

iOS开发UI篇—UITableviewcell的性能优化和缓存机制

iOS开发UI篇—UITableviewcell的性能问题 一.UITableviewcell的一些介绍 UITableView的每一行都是一个UITableViewCell,通过dataSource的 tableView:cellForRowAtIndexPath:方法来初始化每?行 UITableViewCell内部有个默认的子视图:contentView,contentView是UITableViewCell所显示内容的父视图,可显示一些辅助指示视图 辅助指示视图的作?是显示一个表示动作的

iOS开发UI篇—UITableview控件基本使

iOS开发UI篇—UITableview控件基本使用 一.一个简单的英雄展示程序 NJHero.h文件代码(字典转模型) #import <Foundation/Foundation.h> @interface NJHero : NSObject /** * 头像 */ @property (nonatomic, copy) NSString *icon; /** * 名称 */ @property (nonatomic, copy) NSString *name; /** * 描述 */ @

ios开发UI篇—使用纯代码自定义UItableviewcell实现一个简单的微博界面布局

本文转自 :http://www.cnblogs.com/wendingding/p/3761730.html ios开发UI篇—使用纯代码自定义UItableviewcell实现一个简单的微博界面布局 一.实现效果 二.使用纯代码自定义一个tableview的步骤 1.新建一个继承自UITableViewCell的类 2.重写initWithStyle:reuseIdentifier:方法 添加所有需要显示的子控件(不需要设置子控件的数据和frame,  子控件要添加到contentView中

iOS开发UI篇—APP主流UI框架结构

iOS开发UI篇-APP主流UI框架结构 一.简单示例 说明:使用APP主流UI框架结构完成简单的界面搭建 搭建页面效果:                                二.搭建过程和注意点 1.新建一个项目,把原有的控制器删除,添加UITabBarController控制器作为管理控制器 2.对照界面完成搭建 3.注意点: (1)隐藏工具条:配置一个属性,Hideabotton bar在push的时候隐藏底部的bar在那个界面隐藏,就在哪个界面设置. (2).cell可以设置行

iOS开发UI篇—以微博界面为例使用纯代码自定义cell程序编码全过程(一)

iOS开发UI篇-以微博界面为例使用纯代码自定义cell程序编码全过程(一) 一.storyboard的处理 直接让控制器继承uitableview controller,然后在storyboard中把继承自uiviewcontroller的控制器干掉,重新拖一个tableview controller,和主控制器进行连线. 项目结构和plist文件 二.程序逻辑业务的处理 第一步,把配图和plist中拿到项目中,加载plist数据(非png的图片放到spooding files中) 第二步,字

学习IOS开发UI篇--UI知识点总结(四) UITabelView/UITableViewCell

UITabelView:常用属性 @property (nonatomic)          CGFloat    rowHeight;             // will return the default value if unset @property (nonatomic)          CGFloat     sectionHeaderHeight;   // will return the default value if unset @property (nonatom