zoukankan      html  css  js  c++  java
  • UITableView 编辑

    对 UITableView 进行添加,删除,移动,基本操作的流程.

    1.初始化 UITableView 步骤:

      1> 遵守协议 <UITableViewDelegate,UITableViewDataSource>

      2> 设置代理

      3> 实现方法 必须实现的方法有两个 - (NSInteger)tableView:numberOfRowsInSection:(设置每个分组的行数)- (UITableViewCell*)tableView: cellForRowAtIndexPath: (设置每行的显示)

    2.对 tableView 进行增删移动操作 (通过实现协议方法)

      1>设置是否可编译 - (BOOL)tableView: canEditRowAtIndexPath: 返回 YES 可以编辑,返回 NO 不可编辑

      2>设置编辑的类型 - (UITableViewCellEditingStyle)tableView: editingStyleForRowAtIndexPath: 返回 UITableViewCellEditingStyleDelete 删除操作,UITableViewCellEditingStyleInsert 添加操作

      3>完成编辑操作:

        添加和删除操作相似,实现 - (void)tableView: commitEditingStyle: forRowAtIndexPath: 在进行操作时,一定是先对数据操作,然后操作 Cell

          删除操作:(实例方法)deleteSections: withRowAnimation: 删除分组  deleteRowsAtIndexPaths: withRowAnimation: 删除行

          添加操作:(实例方法)insertRowsAtIndexPaths: withRowAnimation: 添加行

        移动操作:- (void)tableView: moveRowAtIndexPath: toIndexPath:在进行操作时,一定是先对数据操作,然后操作 Cell

          移动操作:数据处理过程:先存储要移动数据,删除原数据,插入数据

          调用实例方法:moveRowAtIndexPath: toIndexPath: 两个参数 原位置,要移动到的位置

          限定移动的范围:- (NSIndexPath*)tableView: targetIndexPathForMoveFromRowAtIndexPath: (如果限定在同一分组内移动,判断传入的参数的 section 是否相等,(第一个参数原位置,第二个参数要移动的位置),相等返回要移动到的位置,不同返回原位置.

    个人写的一个简单的实现代码:

      1 //
      2 //  RootViewController.m
      3 //  Lesson10_HomeWork
      4 //
      5 //  Created by Ager on 15/10/26.
      6 //  Copyright © 2015年 Ager. All rights reserved.
      7 //
      8 
      9 #import "RootViewController.h"
     10 
     11 @interface RootViewController ()
     12 {
     13     UITableViewCellEditingStyle style; //表示对 table 的操作类型
     14     BOOL addFlag; //表示 addButton 按钮的状态
     15 }
     16 
     17 @end
     18 
     19 @implementation RootViewController
     20 
     21 - (void)loadView{
     22     self.rootView = [[RootView alloc]initWithFrame:[UIScreen mainScreen].bounds];
     23     self.view = self.rootView;
     24 }
     25 
     26 - (void)viewDidLoad {
     27     [super viewDidLoad];
     28     // Do any additional setup after loading the view.
     29     
     30     //设置代理
     31     self.rootView.tableView.delegate = self;
     32     self.rootView.tableView.dataSource = self;
     33     
     34     //初始化数据
     35     self.DataArray = [NSMutableArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"DataArray" ofType:@"plist"]];
     36     
     37     //添加删除触发按钮
     38     self.navigationItem.rightBarButtonItem = self.editButtonItem;
     39     self.editButtonItem.title = @"删除";
     40     
     41     //添加 添加数据按钮
     42     UIBarButtonItem *addButton = [[UIBarButtonItem alloc]initWithTitle:@"添加" style:UIBarButtonItemStylePlain target:self action:@selector(insertAction:)];
     43     addFlag = NO;
     44     self.navigationItem.leftBarButtonItem = addButton;
     45     
     46     
     47 }
     48 
     49 #pragma mark --- 实现代理方法 ---
     50 
     51 #pragma mark --- 必须实现的方法 ---
     52 
     53 
     54 /**
     55  *  每组数据的行数
     56  */
     57 
     58 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
     59     return [[self.DataArray objectAtIndex:section] count];
     60 }
     61 
     62 
     63 /**
     64  *  设置cell
     65  */
     66 
     67 - (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
     68     static NSString *cell_id = @"cell_id";
     69     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cell_id];
     70     if (!cell) {
     71         cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cell_id];
     72     }
     73     
     74     cell.textLabel.text = [[self.DataArray objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
     75     return cell;
     76 }
     77 
     78 
     79 #pragma mark --- 不必须实现的代理方法 ---
     80 
     81 /**
     82  *  分组数
     83  */
     84 
     85 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
     86     return [self.DataArray count];
     87 }
     88 
     89 
     90 #pragma mark --- 对 TableView 编辑 ---
     91 
     92 
     93 /**
     94  *  设置是否可以编辑
     95  */
     96 - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath{
     97     return YES;
     98 }
     99 
    100 
    101 /**
    102  *  设置编辑类型
    103  */
    104 - (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{
    105     return style;
    106 }
    107 
    108 
    109 /**
    110  *  完成 TableView 操作
    111  */
    112 - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{
    113     //修改数据,修改UI
    114     //先修改数据,在修改UI
    115     
    116     if (editingStyle == UITableViewCellEditingStyleDelete) {
    117         //删除行
    118         if ([[self.DataArray objectAtIndex:indexPath.section] count] == 1) {
    119             //删除分组
    120             [self.DataArray removeObjectAtIndex:indexPath.section];
    121             [tableView deleteSections:[NSIndexSet indexSetWithIndex:indexPath.section] withRowAnimation:UITableViewRowAnimationRight];
    122         }else {
    123             
    124             //删除单行
    125             [[self.DataArray objectAtIndex:indexPath.section] removeObjectAtIndex:indexPath.row];
    126             [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil] withRowAnimation:UITableViewRowAnimationRight];
    127         }
    128     }else if (editingStyle == UITableViewCellEditingStyleInsert){
    129         //添加数据
    130         //添加一行
    131         [[self.DataArray objectAtIndex:indexPath.section] insertObject:@"Ager" atIndex:indexPath.row];
    132         [tableView insertRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil] withRowAnimation:UITableViewRowAnimationRight];
    133     }
    134 }
    135 
    136 
    137 #pragma mark --- cell 移动 ---
    138 
    139 
    140 /**
    141  *  移动行
    142  *
    143  */
    144 - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath{
    145     
    146     //先存储要移动的数据
    147     NSString *str = [[self.DataArray objectAtIndex:sourceIndexPath.section] objectAtIndex:sourceIndexPath.row];
    148     //删除原数据
    149     [[self.DataArray objectAtIndex:sourceIndexPath.section] removeObjectAtIndex:sourceIndexPath.row];
    150     //在要移动到地方添加数据
    151     [[self.DataArray objectAtIndex:destinationIndexPath.section] insertObject:str atIndex:destinationIndexPath.row];
    152     [tableView moveRowAtIndexPath:sourceIndexPath toIndexPath:destinationIndexPath];
    153 }
    154 
    155 
    156 /**
    157  *  限定移动范围
    158  */
    159 - (NSIndexPath*)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath{
    160     if (sourceIndexPath.section == proposedDestinationIndexPath.section) {
    161         return proposedDestinationIndexPath;
    162     }else {
    163         return sourceIndexPath;
    164     }
    165 }
    166 
    167 
    168 #pragma mark --- 添加按钮的方法实现 ---
    169 
    170 
    171 /**
    172  *  点击删除按钮
    173  */
    174 - (void)setEditing:(BOOL)editing animated:(BOOL)animated{
    175     
    176     style = UITableViewCellEditingStyleDelete;
    177     [super setEditing:editing animated:animated];
    178     //关联 tableView
    179     [self.rootView.tableView setEditing:editing animated:animated];
    180     self.editButtonItem.title = editing ? @"完成":@"删除";
    181 }
    182 
    183 
    184 /**
    185  *  点击添加按钮
    186  */
    187 - (void)insertAction:(UIBarButtonItem *)sender{
    188     style = UITableViewCellEditingStyleInsert;
    189     addFlag = !addFlag;
    190     [self.rootView.tableView setEditing:addFlag animated:YES];
    191     sender.title = addFlag ? @"完成":@"添加";
    192 }
    193 
    194 - (void)didReceiveMemoryWarning {
    195     [super didReceiveMemoryWarning];
    196     // Dispose of any resources that can be recreated.
    197 }
    198 
    199 /*
    200 #pragma mark - Navigation
    201 
    202 // In a storyboard-based application, you will often want to do a little preparation before navigation
    203 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    204     // Get the new view controller using [segue destinationViewController].
    205     // Pass the selected object to the new view controller.
    206 }
    207 */
    208 
    209 @end
  • 相关阅读:
    CDH 2、Cloudera Manager的安装
    204 01 Android 零基础入门 03 Java常用工具类 04 Java集合 04 Map集合 01 Map概述
    203 01 Android 零基础入门 03 Java常用工具类 04 Java集合 03 Set集合 07 删除宠物猫信息数据(引入泛型知识点)
    202 01 Android 零基础入门 03 Java常用工具类 04 Java集合 03 Set集合 06 查找宠物猫信息数据
    201 01 Android 零基础入门 03 Java常用工具类 04 Java集合 03 Set集合 05 添加重复的宠物猫信息数据
    200 01 Android 零基础入门 03 Java常用工具类 04 Java集合 03 Set集合 04 添加和显式宠物猫信息
    199 01 Android 零基础入门 03 Java常用工具类 04 Java集合 03 Set集合 03 宠物猫信息管理概述
    198 01 Android 零基础入门 03 Java常用工具类 04 Java集合 03 Set集合 02 案例:在集合中插入字符串
    197 01 Android 零基础入门 03 Java常用工具类 04 Java集合 03 Set集合 01 Set概述
    196 01 Android 零基础入门 03 Java常用工具类 04 Java集合 02 List集合 05 案例:公告的删除和修改
  • 原文地址:https://www.cnblogs.com/Ager/p/4912474.html
Copyright © 2011-2022 走看看