删除

  1. 开启TableView编辑状态
// 实现点击按钮方法(点击编辑按钮,进入编辑状态)
 - (void)editClick:(UIBarButtonItem *)buttonItem
{
// 1.开启编辑状态
[self.tableView setEditing:!self.tableView.editing animated:YES];
// 编辑时更改标题
if (self.tableView.editing == NO){
    buttonItem.title = @"编辑";
}else{
    buttonItem.title = @"完成";
}
}
  1. 允许编辑
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
// 可以利用indexPath控制哪个分区的哪行 不能编辑
return YES;
}
  1. 指定编辑的样式
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{
if (indexPath.section == 0) {
    if ([_firstArray[indexPath.row] isEqualToString:@"添加"]) {
        return UITableViewCellEditingStyleInsert;
    }
}else{
    if ([_secondArray[indexPath.row] isEqualToString:@"添加"]) {
        return UITableViewCellEditingStyleInsert;
    }
}
 return UITableViewCellEditingStyleDelete;
}
  1. 提交编辑
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
    {
    if(editingStyle == UITableViewCellEditingStyleDelete){
        // 删除
        // 先删除数据
        [_firstArray removeObjectAtIndex:indexPath.row];
        // 刷新页面
        // 整体刷新 (UITableView) 重新走一遍数据源代理方法,达到刷新页面的效果
        //[tableView reloadData];
        // 删除的刷新效果 (该方法可以进行多行删除),数组中填所有已经删除的索引
        [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:(UITableViewRowAnimationBottom)];
    }else{
        // 添加
        // 先操作数据
        [_firstArray insertObject:@"123" atIndex:indexPath.row];
        // 刷新界面
        [tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:(UITableViewRowAnimationTop)];

}

移动

移动的步骤:
1.开启编辑状态
2.允许哪个分区的哪行可以移动
3.完成移动 (操作数据源数组 、刷新界面)
4.限制跨区移动

  1. 允许哪个分区的哪行可以移动(第一步删除时已经完成)
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
{
return  YES;
}
  1. 完成移动
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath
{
// sourceIndexPath 来源的索引
// destinationIndexPath 目的地的索引
// 移动的分来:同分区移动 和 跨分区移动
// 判断分区移动
if (sourceIndexPath.section == destinationIndexPath.section) {
        // 同区
        // 操作firstArray
        // 把来源索引下 数组对应的元素 保存一下
        NSString *str = _firstArray[sourceIndexPath.row];
        // 把来源的索引 删除数组中对应的元素
        [self.firstArray removeObjectAtIndex:sourceIndexPath.row];
        // 插入到移动的目的地索引处
        [self.firstArray insertObject:str atIndex:destinationIndexPath.row];

        // 移动刷新方法
        [tableView moveRowAtIndexPath:sourceIndexPath toIndexPath:destinationIndexPath];

        }
  1. 限制跨区移动
- (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath
{
// sourceIndexPath 来源索引
// proposedDestinationIndexPath 建议目的地索引
NSLog(@"执行");
if(sourceIndexPath.section == proposedDestinationIndexPath.section)
{
    // 同区移动 可以返回 目的地的索引
    return proposedDestinationIndexPath;
}else{
    // 跨区移动 需要限制(从哪里来,还会哪里去)
    return sourceIndexPath;
}

}

添加

步骤:(代理传值)
1.将数据中的字典转为模型,创建Model文件,将要传得值设为属性
2.创建ViewController和协议,在初始化方法中布局界面
3.遵守协议
4.设置代理
5.让代理去干活,重写协议中必须实现的方法

  1. 创建model文件
// FoodModel.h文件:
@property (nonatomic, retain) NSString *foodName;
@property (nonatomic, retain) NSString *money;
// FoodModel.m文件:
- (void)dealloc
{
    [_foodName release];
    [_money release];
    [super dealloc];
}


- (void)setValue:(id)value forUndefinedKey:(NSString *)key
{
    NSLog(@"%@",key);
}
  1. 创建ViewController和协议,在初始化方法中布局界面
//SecondViewController.h文件:


#import "FoodModel.h"


@protocol SecondViewControllerDelegate <NSObject>

- (void)addFood:(FoodModel *)model;

@end
@interface SecondViewController : UIViewController <UITextFieldDelegate>

@property (nonatomic, assign) id<SecondViewControllerDelegate> delegate;

@end

// SecondViewController.m文件:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.

self.view.backgroundColor = [UIColor whiteColor];

UITextField *textField = [[UITextField alloc]initWithFrame:CGRectMake(100, 100, 200, 50)];
textField.backgroundColor = [UIColor yellowColor];
textField.delegate = self;
[self.view addSubview:textField];
[textField release];
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
FoodModel *model = [[FoodModel alloc]init];
model.foodName = textField.text;
model.money = @"10";
// 进行传值 让代理去干活 协议中得方法
if ([_delegate respondsToSelector:@selector(addFood:)]) {
      [_delegate addFood:model];
}


[self dismissViewControllerAnimated:YES completion:nil];

[model release];
return YES;
}
  1. 遵守协议
@interface RootTableViewController () <SecondViewControllerDelegate>
  1. 设置代理
- (void)AddBarButtobItemClick:(UIBarButtonItem *)addButtonItem
{
    SecondViewController *secondVC = [[SecondViewController alloc]init];

[self presentViewController:secondVC animated:YES completion:nil];
// 设置代理
secondVC.delegate = self;

[secondVC release];
}
  1. 让代理去干活,重写协议中必须实现的方法
- (void)addFood:(FoodModel *)model
{
// 添加进数组
[self.dataArray addObject:model];
// 刷新页面
[self.tableView reloadData];
}