• iOS学习之UItableView


    一些相关的总结,有点乱.

    •  UITableViewiOS中提供的用来以列的形式展示数据的视图,叫做表现图,但是只有一列,而且只能在垂直方向滚动.继承自UIScrollView.
    •  UITableView由多个分区组成(相当于班级的分组),每个分区由多行组成(相当于每个分组下的人).
    •  UITableView有两种样式,PlainGroup样式,一旦设置之后,后期不能更改. 

     


    继承自UITableViewController 继承自UIViewController的区别. (UITableViewControllerUIViewController的子类)

    • .前者根视图是tableView, 而后者根视图是UIView. 前者不需要指定dataSource,delegate.服从协议. 而后者需要.
    • 前者不需要重写setEditing:animated:方法控制tableView进入编辑状态,而后者需要自己实现.
    • 前者对于UITableViewDataSource协议中的常用方法已经自动生成,而后者需要自己添加对应的方法.

    何时需要继承自UITableViewController?

        当前页面信息的展示主要是以列的形式来展示的场景下, 都可以直接继承自UITableViewController.

        在继承自UITableViewController的视图控制器中访问tableView.

        1.self.view  根视图就是tableView.

        2.self.tableView 有对应的tableView属性.


    UITableView协议中的一些方法

    UITableViewDataSource协议

      1.配置TableView一共有几个分组

      - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;

      2.配置tableView每个分区对应的行数

        - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;

        3.配置用来显示每一行数据的cell.(UITableViewCell)

        - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        //1.创建重用标识符.
        static NSString *identifier = @"heihei";
        //2.根据重用标识符去重用队列中取可重用的cell.
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
        //3.判断是否成功取到可重用的cell.cell是否为空.
        if (!cell) {
            //4.cell为空,说明没有成功取到cell.则创建一个cell.
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:identifier] autorelease];
            cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; //辅助视图样式,小箭头
        }
        NSDictionary *dic = self.addressDic[self.sortedKeys[indexPath.section]][indexPath.row];
        cell.textLabel.text = dic[@"name"];
        cell.detailTextLabel.text = dic[@"phone"];
        cell.imageView.image = [[UIImage imageNamed:dic[@"imageName"]] scaleToSize:CGSizeMake(40, 40)];
        return cell;
    }

        4.配置每个分区的页眉 

        - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section;

        5.配置tableView右侧的分区索引

        - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView;

        //编辑相关的协议方法

        6.设置tableView的哪些行可以允许编辑

        - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath;

        7.提交编辑操作时触发(默认的时删除操作)

        - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath;

    //提交编辑操作, 对删除操作作出处理.
    - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
        //总共分两步:1.修改数据源 2.修改界面
        //1.获取删除行对应的分区key.(是B分组,还是C分组)
        NSString *key = self.sortedKeys[indexPath.section];
        //2.根据key获取对应的可变数组.
        NSMutableArray *group = self.addressDic[key];
        
        if (editingStyle == UITableViewCellEditingStyleInsert) {
            //处理插入操作
            //1.修改数据源
            NSDictionary *dic = @{@"name":@"Frank", @"age":@"18", @"gender":@"man", @"phone":@"110", @"imageName":@""};
            [group insertObject:dic atIndex:indexPath.row];
            //2.修改界面
            [tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationRight];
        } else {
            //处理删除操作
            //需要判断是否要删除一个分区.
            if (group.count == 1) {
                //删除分区
                //1.修改数据源
                //从字典中根据key移除对应的元素.
                [self.addressDic removeObjectForKey:key];
                //从排好序的key值数组中移除对应的key.
                [self.sortedKeys removeObject:key];
                //2.修改界面
                NSIndexSet *indexSet = [NSIndexSet indexSetWithIndex:indexPath.section];
                [tableView deleteSections:indexSet withRowAnimation:UITableViewRowAnimationRight];
            } else {
                [group removeObjectAtIndex:indexPath.row]; //删除行对应的字典.
                //删除界面上的一行.
                [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationRight];
            }
        }
    }

        //移动相关的协议方法

        8.设置tableView哪些行可以允许移动

        - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath;

        9.提交移动操作触发.

        - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath;

    //提交移动操作.
    - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath {
        //因为移动操作界面已经发生变化,我们只需要修改数据源即可.
        //1.获取到分区对应的数组.
        NSMutableArray *group = self.addressDic[self.sortedKeys[sourceIndexPath.section]];//分区对应的数组
        //2.将原位置对应的元素取出来保存.
        NSDictionary *dic = [group[sourceIndexPath.row] retain]; //retain 引用计数加1, 否则移除时就造成引用计数为0,空间回收了.
        //3.将原位置对应的元素删除掉.
        [group removeObjectAtIndex:sourceIndexPath.row];
        //4.将保存的元素插入到目的位置.
        [group insertObject:dic atIndex:destinationIndexPath.row];
        //5.释放所有权
        [dic release];
    }

     

      UITableViewDelegate协议

        1.当tableView的行被选中时触发

        - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;

        2.tableView的行被取消选中时触发

     

        - (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath;

        3.配置tableView某一行的高度

        - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;

        //编辑相关

        4.设置tableView的编辑样式

        - (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath;

        5.设置删除时确认按钮的标题.

        - (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath;

        //移动相关

        6.设置tableView限制跨区移动

        - (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath;

    - (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath {
        //sourceIndexPath 移动之前的位置
        //proposedDestinationIndexPath 即将要移动到的位置
        if (sourceIndexPath.section == proposedDestinationIndexPath.section) {
            return proposedDestinationIndexPath;
        }
        return sourceIndexPath;
        
    }

     


     

    UITableView编辑步骤:

        1.在导航条上添加Edit按钮. 重写setEditing:Animated:方法.

    self.navigationItem.rightBarButtonItem = self.editButtonItem;

        2.控制tableView的可编辑状态.

        3.设置tableView的哪些行可以允许编辑. (dataSource)

        4.设置编辑样式. (delegate)

        5.提交编辑操作. (dataSource) (1)修改数据源 (2)修改界面


     

  • 相关阅读:
    【洛谷4548】[CTSC2006] 歌唱王国(概率生成函数)
    概率生成函数初探
    【AT4432】[ARC103B] Robot Arms(构造)
    【AT4163】[ARC099D] Eating Symbols Hard(哈希)
    【洛谷5398】[Ynoi2018] GOSICK(莫队二次离线)
    【AT4353】[ARC101D] Robots and Exits(树状数组优化DP)
    【AT5161】[AGC037D] Sorting a Grid(二分图匹配)
    【CF573E】Bear and Bowling(分块维护凸壳)
    【CF611G】New Year and Cake(计算几何)
    【洛谷6791】[SNOI2020] 取石子(斐波那契博弈+数位DP)
  • 原文地址:https://www.cnblogs.com/ErosLii/p/4498881.html
Copyright © 2020-2023  润新知