快捷搜索:  汽车  科技

怎么用ios编写代码(iOS开发我的)

怎么用ios编写代码(iOS开发我的)主内容:表尾表头:表头表尾:

怎么用ios编写代码(iOS开发我的)(1)

IU

App中常见的“我的”页面

大部分app都有“我的”页面,也就是个人中心,下图是我们公司app的“我的”页面:

怎么用ios编写代码(iOS开发我的)(2)

这个页面的tableView我把它看做三部分:

表头:

怎么用ios编写代码(iOS开发我的)(3)

表头

表尾:

怎么用ios编写代码(iOS开发我的)(4)

表尾

主内容:

怎么用ios编写代码(iOS开发我的)(5)

主内容

今天我们就来聊一聊主内容这一块的做法,为了不那么单调,我稍微改了一下,如下:

怎么用ios编写代码(iOS开发我的)(6)

方案一:使用静态单元格

对于这种数据不变的tableView,使用静态单元格还是比较方便的,我认识的不少开发者也是采用的这种方法,不清楚的同学可以网上搜下,这里就不讨论了。

方案二:直接在cell上addSubview

首先我们封装好下面这种样式的cell:

怎么用ios编写代码(iOS开发我的)(7)

@interface CQUserCenterCell : UITableViewCell@property (nonatomic strong) CQUserCenterCellModel *model;/** 隐藏cell右边的箭头 */- (void)hideIndicator;@end

model:

@interface CQUserCenterCellModel : NSObject@property (nonatomic copy) NSString *icon;@property (nonatomic copy) NSString *title;@end

那几个独立控件:积分label、未读信息label和夜间模式switch,作为controller的属性,直接添加在相应的cell上。代码如下:

/** 积分label */@property (nonatomic strong) UILabel *pointsLabel;/** 未读消息 */@property (nonatomic strong) UILabel *unreadLabel;/** 夜间模式开关 */@property (nonatomic strong) UISwitch *nightModeSwitch;- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { // 使用唯一复用id NSString *reuseCellID = [NSString stringWithFormat:@"%ld_%ld" indexPath.section indexPath.row]; CQUserCenterCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseCellID]; if (!cell) { cell = [[CQUserCenterCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseCellID]; cell.model = self.modelArray[indexPath.row]; switch (indexPath.row) { case 2: // 我的积分 { self.pointsLabel = [[UILabel alloc]initWithFrame:CGRectMake(140 0 100 40)]; [cell.contentView addSubview:self.pointsLabel]; self.pointsLabel.textColor = [UIColor redColor]; self.pointsLabel.font = [UIFont systemFontOfSize:14]; } break; case 3: // 未读消息 { self.unreadLabel = [[UILabel alloc] initWithFrame:CGRectMake(130 5 16 16)]; [cell.contentView addSubview:self.unreadLabel]; self.unreadLabel.backgroundColor = [UIColor redColor]; self.unreadLabel.textColor = [UIColor whiteColor]; self.unreadLabel.font = [UIFont systemFontOfSize:12]; self.unreadLabel.textAlignment = NSTextAlignmentCenter; self.unreadLabel.layer.cornerRadius = 8; self.unreadLabel.clipsToBounds = YES; self.unreadLabel.hidden = YES; // 默认隐藏 } break; case 4: // 夜间模式 { // 隐藏cell右边的箭头 [cell hideIndicator]; // 夜间模式开关 self.nightModeSwitch = [[UISwitch alloc] init]; [cell.contentView addSubview:self.nightModeSwitch]; self.nightModeSwitch.center = CGPointMake(self.view.frame.size.width - 50 20); [self.nightModeSwitch addTarget:self action:@selector(changeTheme:) forControlEvents:UIControlEventValueChanged]; } break; default: break; } } return cell;}

我这里使用的唯一cell复用id,避免了因cell复用带来的细节问题,也少写了一些代码。

这种方案的优点是:简单明了,任何段位的开发者来维护你的代码都无压力;缺点是代码都写在了C层,让C有点臃肿。

方案三:扩展

扩展cell:

怎么用ios编写代码(iOS开发我的)(8)

@interface CQUserCenterCell (Util)/** 设置积分 */- (void)setPoints:(NSInteger)points;/** 设置未读消息数量 */- (void)setUnreadMessageNum:(NSInteger)unreadMessageNum;/** 添加控制夜间模式的switch @param handler 开启\关闭夜间模式时回调的block */- (void)addNightModeSwitchWithHandler:(void(^)(BOOL isOn))handler;@end

controller的代码相对简练了一些:

/** 积分cell */@property (nonatomic strong) CQUserCenterCell *pointsCell;/** 未读消息cell */@property (nonatomic strong) CQUserCenterCell *unreadCell;/** 夜间模式cell */@property (nonatomic strong) CQUserCenterCell *nightModeCell;- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { // 使用唯一复用id NSString *reuseCellID = [NSString stringWithFormat:@"%ld_%ld" indexPath.section indexPath.row]; CQUserCenterCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseCellID]; if (!cell) { cell = [[CQUserCenterCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseCellID]; cell.model = self.modelArray[indexPath.row]; switch (indexPath.row) { case 2: // 我的积分 { self.pointsCell = cell; } break; case 3: // 未读消息 { self.unreadCell = cell; } break; case 4: // 夜间模式 { [cell addNightModeSwitchWithHandler:^(BOOL isOn) { [self changeTheme:isOn]; }]; } break; default: break; } } return cell;}// 加载数据- (void)loadData { dispatch_after(dispatch_time(DISPATCH_TIME_NOW (int64_t)(1 * NSEC_PER_SEC)) dispatch_get_main_queue() ^{ // 设置积分 [self.pointsCell setPoints:200]; // 设置未读消息数量 [self.unreadCell setUnreadMessageNum:3]; });}// 改变主题色- (void)changeTheme:(BOOL)isNightMode { if (isNightMode) { self.tableView.backgroundColor = [UIColor grayColor]; } else { self.tableView.backgroundColor = [UIColor whiteColor]; }}

我的做法

我用的方案二,因为最简单。

C层臃肿?不存在的,这种简单页面本来就写不到多少代码。

最后

想知道你们是怎么做的。

  • 来源:简书

  • 作者:无夜之星辰

猜您喜欢: