美文网首页
UITableView使用01

UITableView使用01

作者: 佚名_i | 来源:发表于2018-07-06 13:06 被阅读56次

    这里记录一些这几天的研究,关于UITableViewCell的多选主要是下面几点。

    1. 主要代码

    // 打开tableView的编辑状态
    - (IBAction)editAction:(id)sender{
        self.tableView.editing = !self.tableView.editing ;
    }
    
    // cell 编辑状态的样式
    - (UITableViewCellEditingStyle) tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{
       return UITableViewCellEditingStyleInsert | UITableViewCellEditingStyleDelete ;
    }
    //    UITableViewCellEditingStyleNone   `空白` 预留位置,可以自定义使用
    //    UITableViewCellEditingStyleInsert  `插入` 绿地白色加号
    //    UITableViewCellEditingStyleDelete; `删除` 红底白色减号
    }
    

    2. 普通cell的内部子控件

    2.1 普通cell的子控件,一个内容视图和分割线两个子控件

    "<UITableViewCellContentView: 0x7f9c2af449d0; frame = (0 0; 375 44.5); gestureRecognizers = <NSArray: 0x604000655000>; layer = <CALayer: 0x60400023d420>>",
    "<_UITableViewCellSeparatorView: 0x7f9c2af4dd10; frame = (15 44.5; 360 0.5); layer = <CALayer: 0x604000429f80>>"
    

    2.2 开启cell的编辑模式edit时,多了一个UITableViewCellEditControl控件,这个控件并不是cell自己添加的,通过两次切换编辑状态,就会发现UITableViewCellEditControl对象是不固定的,也就是系统添加到cell上的,也只是在可见的cell上添加,这应该是系统提供的优化方式。通过运行时查看cell的属性列表时也是找不到这个属性的。

    "<UITableViewCellContentView: 0x7f9c2af449d0; frame = (0 0; 375 44.5); gestureRecognizers = <NSArray: 0x604000655000>; layer = <CALayer: 0x60400023d420>>",
    "<_UITableViewCellSeparatorView: 0x7f9c2af4dd10; frame = (15 44.5; 360 0.5); layer = <CALayer: 0x604000429f80>>",
    "<UITableViewCellEditControl: 0x7f9c2ad0f0a0; frame = (-38 0; 47 45); alpha = 0; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x60400042a0a0>>"
    
    "<UITableViewCellContentView: 0x7f9c2af449d0; frame = (38 0; 337 44.5); gestureRecognizers = <NSArray: 0x604000655000>; layer = <CALayer: 0x60400023d420>>",
    "<_UITableViewCellSeparatorView: 0x7f9c2af4dd10; frame = (15 44.5; 360 0.5); layer = <CALayer: 0x604000429f80>>",
    "<UITableViewCellEditControl: 0x7f9c2ad0f0a0; frame = (0 0; 47 45); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x60400042a0a0>>"
    

    2.3 选中cell时多了一个UITableViewCellSelectedBackground

    "<UITableViewCellSelectedBackground: 0x7f9c2ac23380; frame = (0 -0.5; 375 45.5); layer = <CALayer: 0x600000624620>>",
    "<UITableViewCellContentView: 0x7f9c2af449d0; frame = (0 0; 375 44.5); opaque = NO; gestureRecognizers = <NSArray: 0x604000655000>; layer = <CALayer: 0x60400023d420>>",
    "<_UITableViewCellSeparatorView: 0x7f9c2af4dd10; frame = (15 44.5; 360 0.5); alpha = 0; layer = <CALayer: 0x604000429f80>>"
    

    2.4 编辑状态cell选中,和上面的规律一致。

    "<UITableViewCellSelectedBackground: 0x7f9c2ac23380; frame = (0 0; 375 44.5); layer = <CALayer: 0x600000624620>>",
    "<UITableViewCellContentView: 0x7f9c2af449d0; frame = (38 0; 337 44.5); gestureRecognizers = <NSArray: 0x604000655000>; layer = <CALayer: 0x60400023d420>>",
    "<_UITableViewCellSeparatorView: 0x7f9c2af4dd10; frame = (15 44.5; 360 0.5); layer = <CALayer: 0x604000429f80>>",
    "<UITableViewCellEditControl: 0x7f9c2ad0f0a0; frame = (0 0; 47 45); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x60400042a0a0>>"
    

    2.5 就 2.2的日志可以看出来,没有必要缓存或者引用UITableViewCellEditControl对象,自定义编辑样式可以使用下面的

    - (void)layoutSubviews{
        [super layoutSubviews];
        NSLog(@"==%@==",self.subviews);
        for (UIControl *uic in self.subviews) {
            if ([uic isKindOfClass:NSClassFromString(@"UITableViewCellEditControl")]) {
                if (self.isSelected) {
                    [uic setValue:[UIImage imageNamed:@"select_status"] forKeyPath:@"_imageView.image"];
                }else{
                    [uic setValue:[UIImage imageNamed:@"deslect_status"] forKeyPath:@"_imageView.image"];
                }
            }
        }
    }
    

    这里强调两点,一调用[super layoutSubviews];,二使用[setValue: forKeyPath]可以_imageView.image设置属性值,比[setValue:forKey]代码量少,没有必要设置对象引用。

    3. 通过运行时查看一个类的属性

    导入头文件#import <objc/runtime.h>

    - (NSArray *)propertys{
       unsigned int count = 0;
        //获取属性的列表,并不会访问父类的属性列表
        objc_property_t *propertyList =  class_copyPropertyList([UITableViewCell class], &count);
        NSMutableArray *propertyArray = [NSMutableArray array];
        for(int i=0;i<count;i++)
        {                //取出每一个属性
            objc_property_t property = propertyList[i];
            //获取每一个属性的变量名
            const char* propertyName = property_getName(property);
            NSString *proName = [[NSString alloc] initWithCString:propertyName encoding:NSUTF8StringEncoding];
            NSString *proName = [[NSString alloc] initWithCString:propertyName encoding:NSUTF8StringEncoding];
            const char * propertyAttributes = property_getAttributes(property);
            NSString *proAttri = [NSString stringWithUTF8String:propertyAttributes];
            NSLog(@"%@:%@",proName,proAttri);
            [propertyArray addObject:proName];
        }
       //c语言的函数`class_copyPropertyList`,所以要去手动的去释放内存
        free(propertyList);
        return propertyArray.copy;
    }
    

    相关文章

      网友评论

          本文标题:UITableView使用01

          本文链接:https://www.haomeiwen.com/subject/nybvuftx.html