UITableView设置界面完整封装(一)
简单MVC实现UITableView设置界面分组数据显示
一:模型
1:cell模型
/** 描述cell图片 */ @property (nonatomic, strong) UIImage *image; /** 描述cell文字 */ @property (nonatomic, strong) NSString *title;
// 根据行模型确定cell右边辅助视图
// 1.提供一个类型枚举,箭头,开头
// 2.用子类去判断cell的类型
+ (instancetype)itemWithImage:(UIImage *)image title:(NSString *)title;
实现文件
+ (instancetype)itemWithImage:(UIImage *)image title:(NSString *)title { iCocosSettingItem *item = [[self alloc] init]; item.image = image; item.title = title; return item; }
2:分组模型
/** 描述当前组有多少行 */ @property (nonatomic, strong) NSArray *items; /** 头部标题 */ @property (nonatomic, strong) NSString *headerTitle; /** 尾部标题 */ @property (nonatomic, strong) NSString *footerTitle; + (instancetype)groupWithItems:(NSArray *)items;
实现文件
+ (instancetype)groupWithItems:(NSArray *)items { iCocosGroupItem *group = [[self alloc] init]; group.items = items; return group; }
二:视图
@interface iCocosSettingCell : UITableViewCell + (instancetype)cellWithTableView:(UITableView *)tableView; /** item行模型,描述cell的外观 */ @property (nonatomic, strong) iCocosSettingItem *item;
实现文件
+ (instancetype)cellWithTableView:(UITableView *)tableView { static NSString *ID = @"cell"; XMGSettingCell *cell = [tableView dequeueReusableCellWithIdentifier:ID]; if (cell == nil) { cell = [[iCocosSettingCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID]; } return cell; } - (void)setItem:(iCocosSettingItem *)item { _item = item; // 设置子控件数据 [self setUpData]; // 设置辅助视图 [self setUpAccessoryView]; } #pragma mark - 设置辅助视图 - (void)setUpData { self.imageView.image = _item.image; self.textLabel.text = _item.title; } #pragma mark - 设置辅助视图 - (void)setUpAccessoryView { // 设置辅助视图 if ([_item isKindOfClass:[iCocosSettingArrowItem class]]) { // 展示箭头 UIImageView *arrowView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"arrow_right"]]; self.accessoryView = arrowView; }else if ([_item isKindOfClass:[iCocosSettingSwitchItem class]]){ // 展示开关 UISwitch *switchView = [[UISwitch alloc] init]; self.accessoryView = switchView; }else{ self.accessoryView = nil; } }
三:控制器
@interface iCocosSettingViewController () // 总共的组数 @property (nonatomic, strong) NSMutableArray *groups; @end @implementation iCocosSettingViewController - (NSMutableArray *)groups { if (_groups == nil) { _groups = [NSMutableArray array]; } return _groups; } - (instancetype)init { return [self initWithStyle:UITableViewStyleGrouped]; } - (void)viewDidLoad { [super viewDidLoad]; // 添加第0组 [self setUpGroup0]; // 添加第1组 [self setUpGroup1]; // 添加第2组 [self setUpGroup2]; } // 添加第0组 - (void)setUpGroup0 { // 创建行模型 // 使用兑换码 iCocosSettingItem *RedeemCode = [iCocosSettingArrowItem itemWithImage:[UIImage imageNamed:@"RedeemCode"] title:@"使用兑换码"]; // Items:存储当前数组有多少行模型 // 创建一个组模型,描述第0组 iCocosGroupItem *group = [iCocosGroupItem groupWithItems:@[RedeemCode]]; // 设置头部标题 group.headerTitle = @"abc"; // 添加组模型到groups数组,有多少个组模型就有多少组 [self.groups addObject:group]; } // 添加第1组 - (void)setUpGroup1 { // 使用兑换码 iCocosSettingItem *RedeemCode = [iCocosSettingArrowItem itemWithImage:[UIImage imageNamed:@"RedeemCode"] title:@"使用兑换码"]; // 使用兑换码 iCocosSettingItem *RedeemCode1 = [iCocosSettingSwitchItem itemWithImage:[UIImage imageNamed:@"RedeemCode"] title:@"使用兑换码"]; // 使用兑换码 iCocosSettingItem *RedeemCode2 = [iCocosSettingSwitchItem itemWithImage:[UIImage imageNamed:@"RedeemCode"] title:@"使用兑换码"]; // 使用兑换码 iCocosSettingItem *RedeemCode3 = [iCocosSettingSwitchItem itemWithImage:[UIImage imageNamed:@"RedeemCode"] title:@"使用兑换码"]; // 描述第一组有多少个行模型,描述第1组 NSArray *items = @[RedeemCode,RedeemCode1,RedeemCode2,RedeemCode3]; // 创建组模型 iCocosGroupItem *group = [iCocosGroupItem groupWithItems:items]; group.headerTitle = @"asd"; group.footerTitle = @"asdasdq"; // 添加到group总数组 [self.groups addObject:group]; } // 添加第2组 - (void)setUpGroup2 { // 使用兑换码 iCocosSettingItem *RedeemCode = [iCocosSettingArrowItem itemWithImage:[UIImage imageNamed:@"RedeemCode"] title:@"使用兑换码"]; // 使用兑换码 iCocosSettingItem *RedeemCode1 = [iCocosSettingArrowItem itemWithImage:[UIImage imageNamed:@"RedeemCode"] title:@"使用兑换码"]; // 使用兑换码 iCocosSettingItem *RedeemCode2 = [iCocosSettingArrowItem itemWithImage:[UIImage imageNamed:@"RedeemCode"] title:@"使用兑换码"]; // 使用兑换码 iCocosSettingItem *RedeemCode3 = [iCocosSettingArrowItem itemWithImage:[UIImage imageNamed:@"RedeemCode"] title:@"使用兑换码"]; // 描述第一组有多少个行模型,描述第1组 NSArray *items = @[RedeemCode,RedeemCode1,RedeemCode2,RedeemCode3]; // 创建组模型 iCocosGroupItem *group = [iCocosGroupItem groupWithItems:items]; group.footerTitle = @"bcd"; // 添加到group总数组 [self.groups addObject:group]; } #pragma mark - 数据源 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return self.groups.count; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { // 取出当前的组模型 iCocosGroupItem * group = self.groups[section]; return group.items.count; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { // 1.创建cell iCocosSettingCell *cell = [iCocosSettingCell cellWithTableView:tableView]; // 取模型 // 哪一组的模型 iCocosGroupItem *group = self.groups[indexPath.section]; // 从模型数组数组中取出对应的模型 iCocosSettingItem *item = group.items[indexPath.row]; // 2.给cell传递模型,给cell的子控件赋值 cell.item = item; return cell; } // 返回第section组的头部标题 - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { // 取出当前是哪一组 iCocosGroupItem *group = self.groups[section]; return group.headerTitle; } // 返回第section组的尾部标题 - (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section { // 取出当前是哪一组 iCocosGroupItem *group = self.groups[section]; return group.footerTitle; } @end
最终的现实界面