@interface MJViewController () <UITableViewDataSource, UITableViewDelegate>
{
    NSMutableArray *_persons;
}
@end
@implementation MJViewController
- (void)viewDidLoad
{
    [super viewDidLoad];
    _persons = [NSMutableArray array];
    for (int i = 0; i<30; i++) {
        Person *p = [[Person alloc] init];
        p.name = [NSString stringWithFormat:@"Person---%d", i];
        p.phone = [NSString stringWithFormat:@"%d", 10000 + arc4random_uniform(10000000)];\
        [_persons addObject:p];
    }
}
#pragma mark - 数据源方法
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return _persons.count;
}
#pragma mark 每一行显示怎样的cell(内容)
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // 1.定义一个标识
    static NSString *ID = @"cell";
    // 2.去缓存池中取出可循环利用的cell
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
    // 3.如果缓存中没有可循环利用的cell
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:ID];
    }
    // 4.设置数据
    // 4.1.取出模型
    Person *p = _persons[indexPath.row];
    // 4.2.姓名
    cell.textLabel.text = p.name;
    // 4.3.手机
    cell.detailTextLabel.text = p.phone;
    return cell;
}
#pragma mark - 代理方法
#pragma mark 当用户提交了一个编辑操作就会调用(比如点击了“删除”按钮)
// 只要实现了这个方法,就会默认添加滑动删除功能
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    // 如果不是删除操作,直接返回
    if (editingStyle != UITableViewCellEditingStyleDelete) return;
    // 1.删除模型数据
    [_persons removeObjectAtIndex:indexPath.row];
    // 2.刷新表格
//    [tableView reloadData];
    [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationTop];
}
#pragma mark 当移动了某一行cell就会调用
// 只要实现了这个方法,就会默认添加排序功能
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath
{
//    NSLog(@"%d --- %d", sourceIndexPath.row, destinationIndexPath.row);
//    [_persons exchangeObjectAtIndex:sourceIndexPath.row withObjectAtIndex:destinationIndexPath.row];
    // 1.取出要拖动的模型数据
    Person *p = _persons[sourceIndexPath.row];
    // 2.删除之前行的数据
    [_persons removeObject:p];
    // 3.插入数据到新的位置
    [_persons insertObject:p atIndex:destinationIndexPath.row];
}
#pragma mark 删除
- (IBAction)remove:(id)sender {
    // 1.进入编辑模式
//    self.tableView.editing = YES;
    BOOL result = !self.tableView.isEditing;
    [self.tableView setEditing:result animated:YES];
}
@end