用魔法数字的缺点
无意义,0、1这样的数字只能表示位置。没有其它的信息。
容易出错,在cell代理方法,高度代理方法,点击代理方法里面要保持一致,容易出错。
不方便修改,如果要修改两个cell的顺序,要修改好几个地方。
下面说一下解决方法,并不是什么高深的东西,有一定开发经验的人应该都懂。对于一个tableview,位置数字肯定是有的,我们要消除数字,那就得找到相应的数据来代替它。这里,主要的场景一般都是一个row对应一种类型的cell,所以类型是固定的,所以我们用一个枚举来定义所有类型的cell。
typedef NS_ENUM(NSInteger, InvestCellType) {
HomeCellTypeOfficial =0,
HomeCellTypeWechat,
HomeCellTypeAlipay,
};
上面是我从项目里直接复制出来的,请忽略名字(取名真是一个痛苦的事【抱头】)。列表的数据一般都是放在一个Array里面,还是以我上面的例子来说明,我有6种类型的model,有些model可能有多个,像上面枚举里面最后那个类型的model就可能有多个。从服务器拉回数据后,我就在vm里面解析好,全放到一个array里面了,就是列表的数据源。下面是我的cellForRow方法:
switch ([self getHomeCellType]) {
case HomeCellTypeOfficial:{
InvestOfficialCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"official" forIndexPath:indexPath];
return cell;
break;
}
case HomeCellTypeWechat:{
InvestWechatCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"wechat" forIndexPath:indexPath];
return cell;
break;
}
case HomeCellTypeAlipay:{
InvestAlipayCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"alipay" forIndexPath:indexPath];
return cell;
break;
}
default:
break;
}
这样的cellForRow方法是不是很简洁。里面的getHomeCellType方法是通过dataArray里面model的类型,拿到对应的cell类型。方法如下:
- (InvestCellType)getHomeCellType {
InvestCellType type = HomeCellTypeOfficial;
switch (self.selectIndex) {
case 0:
type = HomeCellTypeOfficial;
break;
case 1:
type = HomeCellTypeWechat;
break;
case 2:
type = HomeCellTypeAlipay;
break;
default:
break;
}
return type;
}
不是公共代码我们一般不加项目前缀,有点多余的感觉。