UI一揽子计划 10 (UITableView 中cell 的编辑, 增加, 删除、UITableViewController 、)

本文详细介绍了如何在iOS应用中使用UITableView进行编辑和移动操作,包括编辑按钮触发方法、编辑状态切换、编辑样式返回、移动步骤等核心内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、tableView的编辑
tableView 编辑的步骤:
 
 *  1.
tableView成为可编辑状态
 
    编辑按钮触发方法
 
 *  -1.
激活编辑状态

- (void)rightButton:(UIBarButtonItem *)rightButton
{
  
// 开启UITableView 编辑状态
   
// self.tableView.editing 默认是 NO
    [
self.tableView setEditing:!self.tableView.editing animated:YES];
   
  
// 更改按钮的标题
   
if (_tableView.editing) {
        rightButton.
title = @"完成";
    }
else {
        rightButton.
title = @"编辑";
    }
}
 *  2. 返回(指定)可以被编辑的分区的行  (默认是YES)
  // 如果不写的话 默认是YES
- (
BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
  
   
return YES;
   
}
 *  3. 返回(指定)可以被编辑的分区的行的样式  添加 Or 删除
  // 返回哪个分区的哪行的 编辑样式
- (
UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
   
// 先判断分区
   
if (indexPath.section == 0) {
       
// 再判断数据
       
if ([self.firstDataArray[indexPath.row] isEqualToString:@"添加"]) {
           
return UITableViewCellEditingStyleInsert;
        }
    }
else if (indexPath.section == 1) {
       
// 再判断数据
       
if ([self.secondDataArray[indexPath.row] isEqualToString:@"添加"]) {
           
return UITableViewCellEditingStyleInsert;
        }
    }
   
return UITableViewCellEditingStyleDelete;
}
 *  4. 按照编辑的样式 来提交编辑的结果,完成不同的操作
 
        -1-  √
更新数据源数据
        -2-  √
刷新界面
int i = 4, j = 4;
// 4. 按照编辑的样式 提交哪个分区哪行的结果 完成编辑
- (
void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
   
   
NSString *str = [NSString stringWithFormat:@"%d", i];
   
NSString *str1 = [NSString stringWithFormat:@"%d", j];

   
// 更新数据
   
   
// 刷新界面
   
   
// 先判断分区
   
if (indexPath.section == 0) {
       
// 第一分区
           
// 再判断编辑样式
       
if (editingStyle == UITableViewCellEditingStyleDelete) {
           
// 删除
               
// 利用indexPath.row 删除数组中相对应的数据
            [
self.firstDataArray removeObjectAtIndex:indexPath.row];
           
// 刷新界面
               
// 下面方法 用在删除数据的时候刷新界面
               
// 需要一个数组 数组中是删除的索引  这个数组可以是多行的索引
           
// 下面的刷新方法是对行进行操作的
            [
self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:(UITableViewRowAnimationLeft)];
        }
else {
           
// 添加
           
        
//  [self.firstDataArray insertObject:str atIndex:[self.firstDataArray count] - 1];
            [
self.firstDataArray insertObject:str atIndex:indexPath.row];
            [
self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:(UITableViewRowAnimationLeft)];
           
i++;
        }
    }
else {
       
// 第二分区
       
// 再判断编辑样式
       
if (editingStyle == UITableViewCellEditingStyleDelete) {
           
// 删除
            [
self.secondDataArray removeObjectAtIndex:indexPath.row];
           
// 刷新界面
           
// 下面方法 用在删除数据的时候刷新界面
           
// 需要一个数组 数组中是删除的索引  这个数组可以是多行的索引
            [
self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:(UITableViewRowAnimationLeft)];


        }
else {
           
// 添加
            [
self.secondDataArray insertObject:str1 atIndex:indexPath.row];
            [
self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:(UITableViewRowAnimationBottom)];
           
j++;
        }
    }
}
二、tableView的移动
tableView 移动的步骤:
 
 *  1.
tableView成为可编辑状态
  /**编辑按钮触发方法
 
 *  1.
激活编辑状态
 *
 *
 */

- (
void)rightButton:(UIBarButtonItem *)rightButton
{
  
// 开启UITableView 编辑状态
   
// self.tableView.editing 默认是 NO
    [
self.tableView setEditing:!self.tableView.editing animated:YES];
   
  
// 更改按钮的标题
   
if (_tableView.editing) {
        rightButton.
title = @"完成";
    }
else {
        rightButton.
title = @"编辑";
    }
}
 *  2. 返回(指定)可以被移动的分区的行  (默认的是YES)
  - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
{
   
return YES;
}
 *  3. 完成移动后  -1- 更新数据  -2- 刷新界面
// 移动完成

- (
void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath
// sourceIndexPath 来源的索引  (拿起来cell 的位置)
// destinationIndexPath  目的地/终点的索引  (将来要放下cell  的位置)
{
   
// 分两种情况 1. section 的移动(同区移动), 不同section 之间的 移动(跨区移动)
   
if (sourceIndexPath.section == destinationIndexPath.section) {
       
// 同区
       
if (sourceIndexPath.section == 0) {
           
// 操作第一分区数组
           
// 先保存一下来源索引处的数据
           
NSString *str = self.firstDataArray[sourceIndexPath.row];
           
// 再从数组中 按来源索引删除该数据
            [
self.firstDataArray removeObjectAtIndex:sourceIndexPath.row];
           
// 最后再把保存的数据 插入到目的地的索引处
            [
self.firstDataArray insertObject:str atIndex:destinationIndexPath.row];
           
           
// 刷新页面
            [
self.tableView moveRowAtIndexPath:sourceIndexPath toIndexPath:destinationIndexPath];
           
        }
else{
           
// 操作第二分区数组
           
NSString *str = self.secondDataArray[sourceIndexPath.row];
            [
self.secondDataArray removeObjectAtIndex:sourceIndexPath.row];
            [
self.secondDataArray insertObject:str atIndex:destinationIndexPath.row];
            [
self.tableView moveRowAtIndexPath:sourceIndexPath toIndexPath:destinationIndexPath];
        }
    }
else {
       
// 跨区
     }

4.重要的.
***** iOS 中是不允许跨区移动的
// 系统有一个自带的方法限制跨区移动


// 只要拖动 就会触发这个方法
-(
NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath
{
   
// sourceIndexPath 来源的索引  (拿起来cell 的位置)
   
// proposedDestinationIndexPath  推荐/建议的 目的地/终点的索引  (将来要放下cell  的位置)
   
if (sourceIndexPath.section == proposedDestinationIndexPath.section) {
       
return proposedDestinationIndexPath;
    }
else {
       
return sourceIndexPath;
    }
}

三、UITableViewController

 *  UITableViewController
        1.
自带了一个 self.tableView 根屏幕一样大
 
        2.
代理协议 数据源 已经给写好了
       
        3. 实现了一部分 代理方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值