这里记录一些这几天的研究,关于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;
}
网友评论