118删除单元格(扩展知识:添加单元格和移动单元格的位置)

效果如下:

ViewController.h

1 #import <UIKit/UIKit.h>
2
3 @interface ViewController : UITableViewController
4 @property (strong, nonatomic) NSMutableArray *mArrDataSource;
5
6 @end

ViewController.m

  1 #import "ViewController.h"
  2
  3 @interface ViewController ()
  4 - (void)layoutUI;
  5 @end
  6
  7 @implementation ViewController
  8
  9 - (void)viewDidLoad {
 10     [super viewDidLoad];
 11
 12     [self layoutUI];
 13 }
 14
 15 - (void)didReceiveMemoryWarning {
 16     [super didReceiveMemoryWarning];
 17     // Dispose of any resources that can be recreated.
 18 }
 19
 20 - (void)viewDidAppear:(BOOL)animated {
 21     [super viewDidAppear:animated];
 22
 23     //设置表格是否处于编辑模式;默认为NO
 24     [self.tableView setEditing:YES animated:YES];
 25 }
 26
 27 - (void)layoutUI {
 28     _mArrDataSource = [[NSMutableArray alloc] initWithArray:
 29                        @[@"A", @"B", @"C", @"D", @"E", @"F", @"G",
 30                          @"H", @"I", @"J", @"K", @"L", @"M", @"N",
 31                          @"O", @"P", @"Q", @"R", @"S", @"T", @"U",
 32                          @"V", @"W", @"X", @"Y", @"Z", @"添加单元格"]];
 33
 34     self.navigationItem.prompt = @"TableView里面,单元格也被称为Row";
 35     self.navigationItem.title = @"单元格操作(删除、添加、移动)";
 36 }
 37
 38 #pragma mark - TableView
 39 - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
 40     return @"数据列表";
 41 }
 42
 43 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
 44     return 1;
 45 }
 46
 47 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
 48     return [_mArrDataSource count];
 49 }
 50
 51 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
 52     static NSString *cellIdentifier = @"cellIdentifier";
 53     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
 54     if (!cell) {
 55         cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
 56     }
 57     cell.textLabel.text = _mArrDataSource[indexPath.row];
 58     return cell;
 59 }
 60
 61 #pragma mark - TableView, insert or delete row
 62 - (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
 63     //编辑模式下,设置最后的Row为插入模式
 64     UITableViewCellEditingStyle style = tableView.editing && indexPath.row == (_mArrDataSource.count - 1) ? UITableViewCellEditingStyleInsert : UITableViewCellEditingStyleDelete;
 65     return style;
 66 }
 67
 68 - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
 69     switch (editingStyle) {
 70         case UITableViewCellEditingStyleNone: {
 71             break;
 72         }
 73         case UITableViewCellEditingStyleDelete: {
 74             //删除数据源数据
 75             [_mArrDataSource removeObjectAtIndex:indexPath.row];
 76             //删除单元格;注意必须保证操作之前已删除对应的数据源数据,否则报错
 77             [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
 78                              withRowAnimation:UITableViewRowAnimationAutomatic];
 79             break;
 80         }
 81         case UITableViewCellEditingStyleInsert: {
 82             //添加数据源数据
 83             [_mArrDataSource insertObject:@"我是添加的单元格" atIndex:(_mArrDataSource.count - 1)];
 84             //添加单元格;注意必须保证操作之前已添加对应的数据源数据,否则报错
 85             [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
 86                              withRowAnimation:UITableViewRowAnimationAutomatic];
 87             break;
 88         }
 89     }
 90 }
 91
 92 #pragma mark - TableView, move row
 93 - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
 94     //设置最后的Row不可移动
 95     return indexPath.row < (_mArrDataSource.count - 1);
 96 }
 97
 98 - (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath {
 99     //限制单元格移动到最后的Row下方
100     NSIndexPath *indexPath = proposedDestinationIndexPath.row < (_mArrDataSource.count - 1) ? proposedDestinationIndexPath : sourceIndexPath;
101     return indexPath;
102 }
103
104 - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath {
105     NSUInteger sourceRow = sourceIndexPath.row;
106     NSUInteger destinationRow = destinationIndexPath.row;
107     //单元格向下移动时;循环进行当前数据与下一位数据交换位置
108     while (sourceRow < destinationRow) {
109         [_mArrDataSource exchangeObjectAtIndex:sourceRow withObjectAtIndex:(sourceRow + 1)];
110         sourceRow++;
111     }
112     //单元格向上移动时;循环进行当前数据与上一位数据交换位置
113     while (sourceRow > destinationRow) {
114         [_mArrDataSource exchangeObjectAtIndex:sourceRow withObjectAtIndex:(sourceRow - 1)];
115         sourceRow--;
116     }
117 }
118
119 @end

AppDelegate.h

1 #import <UIKit/UIKit.h>
2
3 @interface AppDelegate : UIResponder <UIApplicationDelegate>
4 @property (strong, nonatomic) UIWindow *window;
5 @property (strong, nonatomic) UINavigationController *navigationController;
6
7 @end

AppDelegate.m

 1 #import "AppDelegate.h"
 2 #import "ViewController.h"
 3
 4 @interface AppDelegate ()
 5 @end
 6
 7 @implementation AppDelegate
 8
 9 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
10     _window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
11     ViewController *viewController = [[ViewController alloc] init];
12     _navigationController = [[UINavigationController alloc] initWithRootViewController:viewController];
13     _window.rootViewController = _navigationController;
14     //[_window addSubview:_navigationController.view]; //当_window.rootViewController关联时,这一句可有可无
15     [_window makeKeyAndVisible];
16     return YES;
17 }
18
19 - (void)applicationWillResignActive:(UIApplication *)application {
20 }
21
22 - (void)applicationDidEnterBackground:(UIApplication *)application {
23 }
24
25 - (void)applicationWillEnterForeground:(UIApplication *)application {
26 }
27
28 - (void)applicationDidBecomeActive:(UIApplication *)application {
29 }
30
31 - (void)applicationWillTerminate:(UIApplication *)application {
32 }
33
34 @end
时间: 2024-10-11 17:28:06

118删除单元格(扩展知识:添加单元格和移动单元格的位置)的相关文章

114自定义 UITableViewCell(扩展知识:如何使用xib创建自定义的表格视图单元格 KMTableViewCell)

关键操作: 效果如下: ViewController.h 1 #import <UIKit/UIKit.h> 2 3 @interface ViewController : UITableViewController 4 @property (strong, nonatomic) NSMutableArray *mArrDataList; 5 @property (strong, nonatomic) NSMutableArray *mArrImageList; 6 7 @end ViewCo

FineReport单元格扩展与父子格设置

1.描述 在讲述报表设计之前,首先介绍一下FineReport报表制作的几个基本概念,本章节介绍FineReport报表赖以生存的单元格扩展. 扩展,顾名思义,就是由一变多,那么单元格扩展就是指在web端查看模板效果的时候,原来的单元格由一个变成了多个,这就是单元格扩展,如下图: 2. 单元格扩展 大家对Excel应该都不陌生,用过Excel的人都知道,其单元格只有2个方向,横向和纵向,而FineReport恰恰是一款类Excel的报表工具,其单元格也一样,因此,FineReport报表中单元格

【扩展知识4】指针家的野孩子和地址打印

[扩展知识4] 1.        野指针 2.        %p的使用 ( 1 )野指针 定义:野指针"不是NULL指针,是指向"垃圾"内存的指针.[重量级危险人物] 野指针的成因: 1.        指针变量定义时没有初始化. 2.        指针变量free后没有置于NULL. 3.        指针的使用超出范围 程序举例: [ 程序1 ] //指针变量没有初始化 #include<stdio.h> int main( void) { char

批量删除本地指定扩展名文件工具

VC工具在编译时,会生成大量临时文件,占用很多空间,项目多了,手动删除就会很费力,所以我做了个小工具,可以批量删除指定目录,指定扩展名的文件. 此工具根据配置文件指定的扩展名删除文件,一般我删除VC的扩展名为:.ipch.pdb.pch.sdf.tlog.obj.idb.ilk.res.根据需要,自行配置. 下载地址:http://download.csdn.net/detail/yxstars/8201833 下面是一些vc扩展名的含义: .APS:存放二进制资源的中间文件,VC把当前资源文件

ExtJS 4.2 Date组件扩展:添加清除按钮

ExtJS中除了提供丰富的组件外,我们还可以扩展他的组件. 在这里,我们将在Date日期组件上添加一个[清除]按钮,用于此组件已选中值的清除. 目录 1. Date组件介绍 2. 主要代码说明 3. 代码与在线演示 1. Date组件介绍 这里的Date组件全称为 Ext.form.field.Date,为form表单一个组件. 查看Ext.form.field.Date的源代码的得知需要 Ext.picker.Date. Ext.picker.Date是一个日期选择器,包含了日期选中.渲染布局

038改变状态栏的颜色(扩展知识:关于iOS不同版本的消息通知知识)

效果如下: ViewController.h 1 #import <UIKit/UIKit.h> 2 3 @interface ViewController : UIViewController 4 @end ViewController.m 1 #import "ViewController.h" 2 3 @interface ViewController () 4 - (void)userNotificationDidPush:(UIApplication *)appl

【扩展知识2】函数strlen()和非函数sizeof的使用

[扩展知识2]函数strlen()和非函数sizeof的使用 [扩展目录] strlen函数 sizeof ( 1 )函数strlen() 原型:size_tstrlen ( const char * str ); 返回C字符串(仅仅支持此类型)的长度. //strlen()的使用 #include <stdio.h> int main( void ) { chararray[ ]= "zhijiandeweixiao"; //指尖的微笑 //array为数组的首个地址 p

【扩展知识3】数组的一些难事

[扩展知识3]数组的一些难事 扩展目录 1.        &array+ 1 2.        array+1 3.        &array[ 0 ]+ 1 关于&array+ .array+ 1 和&array[0]+ 1的问题,特别难缠,特难搞懂~-~.所以今天拿来讲解讲解. 由于数组中的各元素的存储单元是连续分配的,因此可以用指针形式来访问数组,数组名就是该数字的首个地址. 如: intarray[100]; array 就是该数组的首地址,其值等于&

[面试题总结及扩展知识]同一进程中的线程共享的资源

又是一道腾讯2014年的面试题: A,栈   B,数据段    C,寄存器组    D,文件描述符 这是解释以及相对应的扩展知识: 线程的共性如下: 线程共享的环境包括:进程代码段. 进程的公有数据(利用这些共享的数据,线程很容易的实现相互之间的通讯). 进程打开的文件描述符. 信号的处理器.  进程的当前目录和进程用户ID与进程组ID. 线程的个性如下: 1.线程ID     每个线程都有自己的线程ID,这个ID在本进程中是唯一的.进程用此来标识线程. 2.寄存器组的值     由于线程间是并

(转)2.4.1 基础知识--添加服务引用与Web引用的区别

<Web服务开发学习实录>第2章构建ASP.NET Web服务,本章我们将学习创建Web服务的各种方法,并重点对使用Visual Studio创建ASP.NET Web服务和修改Web服务的属性进行介绍.本节为大家介绍基础知识--添加服务引用与Web引用的区别. AD: 2.4.1  基础知识--添加服务引用与Web引用的区别 由于.NET Framework 4默认不再推荐Web服务,而是通过WCF来实现Web服务的功能.而.NET Framework 3.5两者都支持,因此在添加时存在一些