类似这样的界面数据怎么设置更优
这种情况有好几种做法: 运行效率差不多, 可以说一致, 但代码可读性和后期维护难度从差到易会有这么一个排列:
直接在cell赋值方法通过if else一个个赋值上去 <
创建数组, 数组包含字典(字典key和value是字符串, 手写的时候易出错) <
创建数组, 数组包含model
补充一句, plist, xib和storyBoard本质上都是xml数据, 所以转换为代码是需要一定资源的, 我们的tableView本地数据可以事先写在plist里面, 用到的时候再拿出来解析, 但个人觉得最优还是直接纯代码, 虽然小型数据看不出区别
下面说一下最优的用model方法:
1.首先创建一个model类, 暂且称之为A类, 里面有俩字符串属性header和footer, 分别对应分区头部和尾部标题.
2.再新建一个A类的子类B, 负责存储每个分区每一行的图标和标题, 图标属性名假设为icon, 标题属性名假设为name,
3.然后在A类创建一个数组属性, 用来装Bmodel们, 假设叫arr
4.在B类中对外声明一个model初始化方法, 将值传进来B类, 如下:
+ (instancetype)modelWithName:(NSString *)name icon:(NSString *)icon{
B *b = [B new];
b.name = name;
b.icon = icon;
return b;
}
这些准备完毕后, 在vc里面懒加载一个数组, 用于装Amodel, 例如:
- (NSArray *)array{
if(!_array){
A *a1 = [A new];
a1.header = @"分区头部标题1";
a1.footer = @"分区尾部标题1";
//a1.arr 元素个数取决于该分区有几行row
a1.arr = @[
[B modelWithName:@"row标题1" icon:@"row图标名1"];
[B modelWithName:@"row标题2" icon:@"row图标名2"];
[B modelWithName:@"row标题3" icon:@"row图标名3"];
];
//有第二第三分区还可以继续声明a2, a3, 数据结构依然如上
_array = @[a1, a2, .......];
}
return _array;
}
数据设置完剩下的tableView协议方法就方便了, 分区数就是self.array.count, row行数:
A *a = self.array[section];
a.arr.count 就是row行数
取出row的协议方法里面怎么赋值呢?
A *a = self.array[section];
B *b = a.arr[indexPath.row];
cell.labelOfTitle.text = b.name;
cell.imageViewOfIcon.image = [UIImage imageNamed:b.icon];
剩下分区头部标题和尾部标题:
A *a = self.array[section];
return a.header;
尾部标题同理
当需求发生改变, 要改的只是在vc懒加载的那个数组而已, tableView所有协议方法都不用动, 除非cell样式有新需求那没招, 就是这样了, 完结, 撒花!