TableEdit UI_10
1.让tableView处于编辑状态,(默认所有的cell都处于编辑状态,默认下的编辑样式是删除)
2.设置哪些cell可以编辑
3.设置编辑的样式(删除,插入)
1.让tableView处于编辑状态
2.设置哪些cell可以移动

self.window.rootViewController
=
[[[UINavigationController
alloc]initWithRootViewController:[RootViewController
alloc]]autorelease];
#import "DetailViewController.h"
@interface RootViewController
()<</span>UITableViewDataSource,UITableViewDelegate>
@property(nonatomic,retain)NSMutableDictionary
*dict;
@property(nonatomic,retain)NSMutableArray *orderKeys;
@end
@implementation RootViewController
-(void)dealloc{
self.dict = nil;
self.orderKeys = nil;
[super
dealloc];
(void)loadView{
UITableView
*tableView =
[[UITableView alloc]initWithFrame:[UIScreen mainScreen].bounds style:(UITableViewStylePlain)];
//设置数据源代理
tableView.dataSource = self;
//设置业务代理
tableView.delegate = self;
//将tableView 指定为rootViewController
根视图
self.view = tableView;
[tableView release];
}
(void)viewDidLoad {
[super
viewDidLoad];
self.view.backgroundColor = [UIColor brownColor];
配置导航条的方法
[self
configureNavigationContent];
从plist文件读取数据
[self
readDataFromPlist];
(void)readDataFromPlist{
1.获取文件路径
*filePath =
[[NSBundle mainBundle]pathForResource:@"Contacts.plist"
ofType:nil];
2.根据文件路径初始化字典对象,因为此时文件的最外层是字典
self.dict = [NSMutableDictionary
dictionaryWithContentsOfFile:filePath];
//
NSLog(@"%@",diict);//验证是否取出来
copy一个一摸一样的字典出来,枚举copy出来的字典,修改原来的字典
NSDictionary
*copyDict =
[NSDictionary dictionaryWithDictionary:self.dict];
遍历字典
for (NSString *key in copyDict) {
NSArray
*array =
copyDict[key];
//初始化可变数组
NSMutableArray
*mArr =
[NSMutableArray arrayWithArray:array];
[self.dict setValue:mArr forKey:key];
}
//3.获取字典中所有的key值
NSArray
*keys
= self.dict.allKeys;
//4.对数组中keys排序
NSArray *array =
[keys sortedArrayUsingSelector:@selector(compare:)];
//5.初始化存放key的数组
self.orderKeys = [NSMutableArray arrayWithArray:array];
}
//配置导航条的显示的内容
- (void)configureNavigationContent{
self.navigationItem.title =
@"通讯录";
self.navigationController.navigationBar.barTintColor
= [UIColor orangeColor];
//设置编辑按钮
self.navigationItem.rightBarButtonItem
= self.editButtonItem;
}
//重写点击Edit按钮方法
- (void)setEditing:(BOOL)editing
animated:(BOOL)animated{
[super
setEditing:editing animated:animated];
//
NSLog(@"%d",editing);
验证可编辑状态
//
editing
为1时可以编辑,为0时不可以编辑
[(UITableView
*)self.view
setEditing:editing animated:YES ];
——————————————————————————————————
#pragma mark
必须实现的数据源代理方法
//2.配置哪些cell可以编辑
- (BOOL)tableView:(UITableView *)tableView
canEditRowAtIndexPath:(NSIndexPath *)indexPath{
//
if (indexPath.section < 3) {
//
return YES;
//
}
//
return NO;
return
indexPath.section <</span> 3 ? YES : NO;
}
//设置deligt为删除
- (NSString *)tableView:(UITableView *)tableView
titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath
*)indexPath{
return
@"删除";
}
//4.提交编辑操作
- (void)tableView:(UITableView *)tableView
commitEditingStyle:(UITableViewCellEditingStyle)editingStyle
forRowAtIndexPath:(NSIndexPath *)indexPath{
//先修改数据源再更新UI(界面)
//1.根据分区索引获取key值,确定要删除的cell在哪个分区(eg:B分区
D分区)
NSString
*key
= self.orderKeys[indexPath.section];
//2.根据key值拿到字典中对应的分组
NSMutableArray
*group =
self.dict[key];
//删除
if (editingStyle ==
UITableViewCellEditingStyleDelete)
{
//处理删除操作
if (1 == group.count) {//删除整个分组
//1.先删除数据源,从字典中移除key值
[self.dict removeObjectForKey:key];
//删除索引栏数组中的对应的元素
[self.orderKeys removeObjectAtIndex:indexPath.section];
//2.更新UI界面
//创建一个NSIndexSex
对象,使用分区下标初始化
NSIndexSet
*indexSet =
[NSIndexSet indexSetWithIndex:indexPath.section];
[tableView deleteSections:indexSet withRowAnimation:(UITableViewRowAnimationLeft)];
}else{//删除对应的cell即可
//先删除数据源
[group removeObjectAtIndex:indexPath.row];
//再更新UI界面
//tableView删除是可以删除多行
[tableView deleteRowsAtIndexPaths:@[indexPath]
withRowAnimation:(UITableViewRowAnimationLeft)];
}
}else{//添加
//1.准备要插入的数据
NSDictionary
*dic =
@{@"name":@"黄凯",@"gender":@"妖",@"age":@"25",@"phone":@"3838438",@"imageName":@"1.png",@"says":@"千人斩"};
//2.修改数据源
[group insertObject:dic atIndex:indexPath.row];
//3.更行UI界面
[tableView insertRowsAtIndexPaths:@[indexPath]
withRowAnimation:(UITableViewRowAnimationRight)];
}
}
- (NSInteger)numberOfSectionsInTableView:(UITableView
*)tableView{
//根据字典中键值对的个数返回二分区个数
return
self.dict.count;
}
//返回row个数
- (NSInteger)tableView:(UITableView *)tableView
numberOfRowsInSection:(NSInteger)section{
//1.获取对应分区下标所对应的key值
NSString
*key =
self.orderKeys[section];
//2.根据key值取出字典的value值并且返回数组元素的个数
return
[self.dict[key]count];
}
//返回区头标题
- (NSString *)tableView:(UITableView *)tableView
titleForHeaderInSection:(NSInteger)section{
//返回对应分区区头
return
self.orderKeys[section];
}
//返回右侧索引栏
- (NSArray *)sectionIndexTitlesForTableView:(UITableView
*)tableView{
return
self.orderKeys;
}
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath{
//1.重建重用id标示
static
NSString
*identifier =
@"cell";
//2.tableView对象去重用池取可以重用的cell
UITableViewCell *cell
=
[tableView dequeueReusableCellWithIdentifier:identifier];
//3.判断有没有取到cell
if (cell == nil) {
cell = [[[UITableViewCell alloc]initWithStyle:(UITableViewCellStyleSubtitle)
reuseIdentifier:identifier]autorelease];
}
//展示数据步骤:
//1.根据cell所在分区的索引获取对应的key值
NSString
*key =
self.orderKeys[indexPath.section];
//2.根据key值获取字典中的value值
NSArray
*values =
self.dict[key];
//3.根据row的索引获取数组中对应的元素
NSDictionary
*pDict =
values[indexPath.row];
//
NSLog(@"%@",pDict);//验证是否取得字典中的人信息
//4.取出字典中数据用cell展示
cell.imageView.image = [UIImage imageNamed:pDict[@"imageName"]];
cell.textLabel.text = pDict[@"name"];
cell.detailTextLabel.text = pDict[@"phone"];
return
cell;
}
————————————————————————————————
#pragma mark
tableView 的移动
//设置哪些行可以移动
- (BOOL)tableView:(UITableView *)tableView
canMoveRowAtIndexPath:(NSIndexPath *)indexPath{
return
YES;
}
//提交移动后的操作
- (void)tableView:(UITableView *)tableView
moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath
toIndexPath:(NSIndexPath *)destinationIndexPath{
//
sourceIndexPath cell原来的位置
//
destinationIndexPath
cell移动之后的位置
//
移动操作不需要更新UI界面,因为移动的时候UI界面已经发生了变化,此时只需修改数据源即可
//首先获取cell展示的数据所在的数组
//1.取出key值
NSString
*key =
self.orderKeys[sourceIndexPath.section];
//2.取出字典中key值对应的数组
NSMutableArray
*mArr
= self.dict[key];
//3.将原来的数据取出来一份保存起来
NSDictionary
*dic =
[mArr[sourceIndexPath.row]retain];//2
//4.删除数组中原来位置的元素
[mArr
removeObjectAtIndex:sourceIndexPath.row];//1
//5.将元素插入到数组中新的位置
[mArr
insertObject:dic atIndex:destinationIndexPath.row];//2
//释放dic
[dic
release];//1
}
//如果移动过后不是在原来的分区,则取消移动结果返回原来位置
- (NSIndexPath *)tableView:(UITableView *)tableView
targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath
toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath{
//
sourceIndexPath cell原来的位置
//
proposedDestinationIndexPath
cell移动之后的位置
//如果在同一分区则让cell移动,返回移动后的位置
if (sourceIndexPath.section
==
proposedDestinationIndexPath.section) {
return
proposedDestinationIndexPath;
}else{//如果不在同一分区,返回移动之前的位置
return
sourceIndexPath;
}
}
——————————————————————-——————————
#pragma mark
业务代理方法的实现
//3.设置tableView的编辑样式
- (UITableViewCellEditingStyle)tableView:(UITableView
*)tableView
editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{
//
if (indexPath.section < 2) {
//
return UITableViewCellEditingStyleDelete;
//
}else{
//
return UITableViewCellEditingStyleInsert;
//
}
//
return NO;
return
indexPath.section <</span> 2 ? UITableViewCellEditingStyleDelete
: UITableViewCellEditingStyleInsert;
}
//设置行高
- (CGFloat)tableView:(UITableView *)tableView
heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return
80.0;
}
- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
DetailViewController
*detailVC =
[[DetailViewController
alloc]init];
NSString
*key =
self.orderKeys[indexPath.section];
NSMutableArray
*mArr =
self.dict[key];
//取出数组中的字典并赋值给属性
NSDictionary
*dic =
mArr[indexPath.row];
detailVC.dic = dic;
[self.navigationController
pushViewController:detailVC
animated:YES];
[detailVC release];
(void)dealloc{
self.dic = nil;
[super
dealloc];
}
- (void)viewDidLoad {
[super
viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
[(DetailView *)self.view assignAllController:self.dic];
}
- (void)loadView{
DetailView
*detaileView =
[[DetailView alloc]initWithFrame:[UIScreen mainScreen].bounds];
self.view = detaileView;
[detaileView release];

TableEdit UI_10的更多相关文章
- UITableView与UISearchController搜索及上拉加载,下拉刷新
#import "ViewController.h" #import "TuanGouModel.h" #import "TuanGouTableVi ...
- UITableView相关知识点
//*****UITableView相关知识点*****// 1 #import "ViewController.h" // step1 要实现UITableViewDataSou ...
- Xcodeproject详解
前言 在 iOS 开发过程中,我们经常会在 Xcode 里面做一些配置,比如添加系统库.第三方库,修改证书配置文件,修改编译属性等等. 在这个过程里面,一般大家仅仅只是根据经验来配置这些,并没有比较清 ...
- Ext.net
.FileTypeName=="附件") { command.text="上传"; ...
- bjui给出的一个标准应用的首页
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="utf-8&quo ...
- JavaWeb项目开发案例精粹-第6章报价管理系统-07View层
1. 2.back_index.html <HTML> <HEAD> <META HTTP-EQUIV="Content-Type" CONTENT= ...
- BJUI 转
B-JUI 前端框架B-JUI(Bootstrap for DWZ)是一个富客户端框架,基于DWZ-jUI富客户端框架修改. 本文是B-JUI中文使用手册,包括使用示例代码,感兴趣的同学参考下. 概览 ...
- [ipsec][strongswan] 使用wireshark查看strongswan ipsec esp ikev1 ikev2的加密内容
一,编译,启用strongswan的save-keys plugin ./configure --prefix=/root/OUTPUT --exec-prefix=/root/OUTPUT --en ...
- jQuery EasyUI window窗口使用实例
需求:点击[增加]按钮,弹出窗口,并对所有输入项内容进行校验,校验通过就提交给后台的action处理,没有通过校验就弹窗提示. <!DOCTYPE html> <html> ...
随机推荐
- 数据结构之Trie树
1. 概述 Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树. Trie一词来自retrieve,发音为/tr ...
- Head First Java设计模式思维导图总结
关于Head First Java设计模式的思维导图总结:
- Java常量初始化后不会再去重新获取
Java虚拟机编译机制:更改常量部分 最近一个Java项目中需要修改一个静态常量的值,本地修改编译以后调试正常,然后把对应的entity类的class文件上传到服务器对应的目录以后系统依旧我行我素,各 ...
- 利用生产者消费者模型和MQ模型写一个自己的日志系统-并发设计里一定会用到的手段
一:前言 写这个程序主要是用来理解生产者消费者模型,以及通过这个Demo来理解Redis的单线程取原子任务是怎么实现的和巩固一下并发相关的知识:这个虽然是个Demo,但是只要稍加改下Appender部 ...
- Java不走弯路教程(1.环境搭建)
1.环境搭建在开始写第一个Java程序之前,我们需要做一些简单的准备工作. 1.1 还记得DOS吗 我们可以通过图形界面来操作我们的电脑.但作为程序员,你首先需要学会用命令行的方式来操作电脑,因为不是 ...
- C#系统之垃圾回收
1. using System; using System.Collections.Generic; using System.Linq; using System.Text; using Syste ...
- Docker部署Zabbix+Grafana监控
Docker部署Zabbix+Grafana监控 环境 centos 7 ; Docker 17.12.0-ce ; docker-compose version 1.20.1 2018-4-1 当前 ...
- 设计模式一日一练:中介者模式(Mediator)
Mediator模式,用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式的相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 比较典型的例子是联合国.QQ群等.比如,如果中国有 ...
- 在查询语句中使用 NOLOCK 和 READPAST
对于非银行等严格要求事务的行业,搜索记录中出现或者不出现某条记录,都是在可容忍范围内,所以碰到死锁,应该首先考虑,我们业务逻辑是否能容忍出现或者不出现某些记录,而不是寻求对双方都加锁条件下如何解锁的问 ...
- Android开发学习之路--性能优化之布局优化
Android性能优化方面也有很多文章了,这里就做一个总结,从原理到方法,工具等做一个简单的了解,从而可以慢慢地改变编码风格,从而提高性能. 一.Android系统是如何处理UI组件的更新操作的 ...