• UI学习笔记---第十天UITableView表视图编辑


    UITableView表视图编辑

    表视图编辑的使用场景

    当我们需要手动添加或者删除某条数据到tableView中的时候,就可以使用tableView编辑.比如微信 扣扣中删除和某人的通话

    当我们需要手动调整单元格的顺序时,就可以通过tableView移动,移动单元格到指定位置

    代理AppDelegate.m中代码

    #import "AppDelegate.h"
    #import "RootViewController.h"
    @implementation AppDelegate
    -(void)dealloc
    {
        [_window release];
        [super dealloc];
    }
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
        // Override point for customization after application launch.
        self.window.backgroundColor = [UIColor whiteColor];
        
        RootViewController *rootVC = [[RootViewController alloc] init];
        UINavigationController *ngVC = [[UINavigationController alloc] initWithRootViewController:rootVC];
        self.window.rootViewController = ngVC;
        
        [ngVC release];
        [rootVC release];
    
        [self.window makeKeyAndVisible];
        return YES;
    }

    RootViewController.h中建立一个可变数组属性 

     NSMutableArray *_mArr;

    RootViewController.m中初始化和loadView代码

    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
    {
        self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
        if (self) {
            self.navigationItem.title = @"百家讲坛";
            self.navigationItem.rightBarButtonItem = self.editButtonItem;//控制器自带的编辑按钮
            _mArr = [[NSMutableArray alloc] initWithObjects:@"",@"",@"",@"",@"",@"",@"",@"",@"唐僧",@"孙悟空",@"猪八戒",@"沙僧",@"小白龙",@"二郎神",@"哪吒",@"雷震子", nil];
            // Custom initialization
        }
        return self;
    }
    -(void)loadView
    {
        
        UITableView *table = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 320, 480) style:UITableViewStyleGrouped];
        table.dataSource = self;
        table.delegate = self;
        self.view = table;
        [table release];
    
    }
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        return [_mArr count];
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *identifier = @"reuse";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
        if (cell == nil) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
        }
        cell.textLabel.text = [_mArr objectAtIndex:indexPath.row];
    //    tableView.editing = YES;
        //cell右侧属性
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
        return cell;
    }

    编辑的步骤

    1.让tableView处于编辑状态

    -(void)setEditing:(BOOL)editing animated:(BOOL)animated
    {
        //调用父类方法,实现edit和done的变换
        [super setEditing:editing animated:animated];
        UITableView *tableView = (UITableView *)self.view;
        [tableView setEditing:editing animated:animated];
    }

    2.指定tableView那些行可以编辑

     //设置cell的可编辑状态,默认是yes
    - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
    {
    //    if (indexPath.row == 0) {
    //        return YES;
    //    }
        return YES;
    }

    3.指定tableView的编辑的样式(添加.删除)

    //delegate中得方法
    - (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (indexPath.row ==0) {
            return UITableViewCellEditingStyleInsert;//添加
        }
        return UITableViewCellEditingStyleDelete;//删除
    }

    4.编辑完成(先操作数据源,后修改UI)

    //点击加号或者delete时触发的事件
    - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (editingStyle == UITableViewCellEditingStyleDelete) {
            [tableView beginUpdates];
            //删除数据  (写在删除cell前面  或者写一个[tableView beginUpdates]放前面一个[tableView endUpdates]放后面)
            [_mArr removeObjectAtIndex:indexPath.row];
            //删除cell
            [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationRight];
            [tableView endUpdates];
            NSLog(@"删除");
        }else{
            [tableView beginUpdates];
            [_mArr insertObject:@"hello" atIndex:indexPath.row];
            [tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationRight];
            [tableView endUpdates];
            
            NSLog(@"添加");
        }
    }

    表视图的移动

    移动的步骤

    1.让tableView处于编辑状态

    -(void)setEditing:(BOOL)editing animated:(BOOL)animated
    {
        //调用父类方法,实现edit和done的变换
        [super setEditing:editing animated:animated];
        UITableView *tableView = (UITableView *)self.view;
        [tableView setEditing:editing animated:animated];
    }

    2.指定tableView哪些行可以移动

    -(BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return YES;
    }
    

    3.移动完成

    - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath
    {
        NSString *str = [_mArr objectAtIndex:sourceIndexPath.row];
        
        //引用计数加1.避免出现野指针
        [str retain];
        
        
        //删除元素
        [_mArr removeObjectAtIndex:sourceIndexPath.row];
        //插入元素
        [_mArr insertObject:str atIndex:destinationIndexPath.row];
        
        [str release];//释放之前,retain的对象
    }

    监测移动过程,实现限制跨区移动

    - (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath
    {
        NSLog(@"%d",sourceIndexPath.row);
        NSLog(@"%d",proposedDestinationIndexPath.row);
        if (sourceIndexPath.row == [_mArr count]-1) {
            return sourceIndexPath;
        }else{
        return proposedDestinationIndexPath;
        }
    }

    UITableViewController表视图控制器

    继承自UIViewController

    自带一个tableView,根视图就是tableView

    模板自带编辑移动相关的代码

  • 相关阅读:
    钩子函数和回调函数
    Vue.js的坑
    数据库清空表中的数据
    chrome jsonView插件安装
    PostgreSQL数据的导出导入
    PostgreSQL9.6.2的WINDOWS下安装
    HEXO+Github,搭建属于自己的博客
    Vue.js 入门指南之“前传”(含sublime text 3 配置)
    win系统下nodejs安装及环境配置
    Vue.js学习网址
  • 原文地址:https://www.cnblogs.com/limicheng/p/3861583.html
Copyright © 2020-2023  润新知