UITableView (4): 在TableView中移动cell和Section 从TableView中删除cell和section 添加系统默认刷新控件

时间:2022-09-15 22:22:03

一  .问题:你想用流畅直观的动画来移动和拖拽TableView中的cell和section

方案:

  用moveSection:toSection:方法把一个Section移动到新位置.

  用moveRowAtIndexPath:toIndexPath:方法把一个cell从当前位置移动到新位置

例子:

  创建一个TableView并在其中加载3个Section,每个Section有3个cell

#pragma - mark 初始化数据

- (NSMutableArray *)newSectionWithIndex:(NSUInteger)Index withCellCount:(NSUInteger)cellCount{
    NSMutableArray *result = [[NSMutableArray alloc]init];
    for (NSUInteger counter = 0; counter < cellCount; counter++) {
        [result addObject:[[NSString alloc]initWithFormat:@"Section %lu Cell %lu",Index,counter + 1]];
    }
    return result;
}
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    //在实例化方法中填充数据
    if (self != nil) {
        _arrayOfSections = [[NSMutableArray alloc]init];
        NSMutableArray *section1 = [self newSectionWithIndex:1 withCellCount:3];
        NSMutableArray *section2 = [self newSectionWithIndex:2 withCellCount:3];
        NSMutableArray *section3 = [self newSectionWithIndex:3 withCellCount:3];
        [_arrayOfSections addObject:section1];
        [_arrayOfSections addObject:section2];
        [_arrayOfSections addObject:section3];
    }
    return self;
}

以上功能要实现 ,在AppDelegate中实现

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    ViewController *vc = [[ViewController alloc]initWithNibName:nil bundle:nil];
    self.window.rootViewController = vc
    ;
    return YES;
}

然后创建TableView并实现相关协议方法

#pragma mark - 协议方法
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    return _arrayOfSections.count;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return [[_arrayOfSections objectAtIndex:section]count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *result = nil;
    static NSString *cellIdentifier = @"CellIdentifier";
    result = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (result == nil) {
        result = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
    }
    result.textLabel.text = [[_arrayOfSections objectAtIndex:indexPath.section]objectAtIndex:indexPath.row];
    return result;
}
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    _myTableView = [[UITableView alloc]initWithFrame:self.view.bounds style:UITableViewStyleGrouped];
    _myTableView.autoresizingMask = UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth;
    _myTableView.dataSource = self;
    _myTableView.delegate = self;
    
    [self.view addSubview:_myTableView];
    
    NSTimer *timer = [NSTimer timerWithTimeInterval:2.0f target:self selector:@selector(moveSection1ToSection3) userInfo:nil repeats:NO];
    [timer fire];
}

最后实现section 和 cell 的相关移动  ,功能实现代码如下:

#pragma mark - Section 和 cell 是如何实现移动的
//section1 移动到section3
- (void)moveSection1ToSection3{
    //数据操作
    NSMutableArray *section1 = [_arrayOfSections objectAtIndex:0];
    [_arrayOfSections removeObject:section1];
    [_arrayOfSections addObject:section1];
    //TableView移动section
    [_myTableView moveSection:0 toSection:2];
    
    [self moveCellInSection1ToCell2InSection1];
}
//同section移动cell
- (void)moveCellInSection1ToCell2InSection1{
    //数据
    NSMutableArray *section1 = [_arrayOfSections objectAtIndex:0];
    NSString *cell1InSection1 = [section1 objectAtIndex:0];
    [section1 removeObject:cell1InSection1];
    [section1 insertObject:cell1InSection1 atIndex:1];
    //视图
    [_myTableView moveRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] toIndexPath:[NSIndexPath indexPathForRow:1 inSection:0]];
    
    [self moveCell2InSection1ToCell1InSection2];
}
//不同section移动cell
- (void)moveCell2InSection1ToCell1InSection2{
    NSMutableArray *section1 = [_arrayOfSections objectAtIndex:0];
    NSMutableArray *section2 = [_arrayOfSections objectAtIndex:1];
    NSString *cell2InSection1 = [section1 objectAtIndex:1];
    [section1 removeObject:cell2InSection1];
    [section2 insertObject:cell2InSection1 atIndex:0];
    
    [_myTableView moveRowAtIndexPath:[NSIndexPath indexPathForRow:1 inSection:0] toIndexPath:[NSIndexPath indexPathForRow:0 inSection:1]];
}

 

二.从TableView中删除cell和section

1.删除section:

  首先删除数据源中的section;

  然后调用TableView的实例方法deleteSection:withRowAnimation: 第一个参数是NSIndexSet类型,可通过indexSetWithIndex: 来实例化 且indexSetWithIndexesInRange:能

2.删除cell:

  首先删除cell对应的数据;

  deleteRowsAtIndexPaths:withRowAnimation:    

#pragma mark - 删除cell和section
//删除section
- (void)deleteSection1{
    //数据源
    [_arrayOfSections removeObjectAtIndex:0];
    //然后删除TableView的section
    NSIndexSet *sectionToDelete = [NSIndexSet indexSetWithIndex:0];
    [_myTableView deleteSections:sectionToDelete withRowAnimation:UITableViewRowAnimationAutomatic];
    [self deleteCell2InSection3];
}

//删除cell
- (void)deleteCell2InSection3{
    NSMutableArray *section3 = [_arrayOfSections objectAtIndex:[_arrayOfSections count]-1];
    [section3 removeObjectAtIndex:1];
    //添加多个indexPath删除多行
    [_myTableView deleteRowsAtIndexPaths:[NSArray arrayWithObjects:[NSIndexPath indexPathForRow:1 inSection:2], nil] withRowAnimation:UITableViewRowAnimationAutomatic];
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

 三. 向TableView添加系统默认刷新控件 UIRefreshController

//刷新控件
    _refreshControl = [[UIRefreshControl alloc]init];
    [_refreshControl addTarget:self action:@selector(handleRefresh:) forControlEvents:UIControlEventValueChanged];
    [_myTableView addSubview:_refreshControl];
- (void)handleRefresh:(id)Sender{
    NSLog(@"valueChanged");
    [_refreshControl endRefreshing];
}

该刷新简单实现,更多功能再添加..