UITableView使用01

2018-07-06  本文已影响56人  佚名_i

这里记录一些这几天的研究,关于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;
}
上一篇下一篇

猜你喜欢

热点阅读