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

最终的现实界面

iOS开发——开发必备OC篇&UITableView设置界面完整封装(一)的更多相关文章

  1. iOS开发——开发必备OC篇&UITableView设置界面完整封装(三)

    UITableView设置界面完整封装(三) 简单MVC实现UITableView设置界面之界面跳转 创建一个需要调整的对应的控制器 在需要调整的类型模型中创建对应的属性用来实现调整类型控制器的设置 ...

  2. iOS开发——开发必备OC篇&UITableView设置界面完整封装(二)

    UITableView设置界面完整封装(二) 简单MVC实现UITableView设置界面之Cell右边类型设置 首先来看看第一种方法证明使用,结合两种方法之后根据个人的爱好去选择就可以了, 一:使用 ...

  3. iOS开发——开发必备OC篇&UITableView设置界面完整封装(四)

    设置界面完整封装(四) 简单MVC实现UITableView设置界面完善封装及拓展使用 关于使用和拓展, 其实基本上就是同UItableView,知识讲数据改一下就可以 拓展使用 1:首先定义一个数组 ...

  4. ios开发——实用技术篇OC篇&iOS的主要框架

    iOS的主要框架         阅读目录 Foundation框架为所有的应用程序提供基本系统服务 UIKit框架提供创建基于触摸用户界面的类 Core Data框架管着理应用程序数据模型 Core ...

  5. iOS应用 跳转到系统的设置界面

    现在很多APP都需要获取用户权限,例如,允许调用位置信息,读取短信,拨打电话,开启WIFI,掉头摄像头等,用户不允许APP获取这些权限的时候.最好的用户体验是,直接跳转到系统设置界面,让用户自己设置. ...

  6. iOS开发——UI篇OC篇&UITableView简单封装

    UITableView简单封装 UITableView时iOS开发中使用最多也是最重的一个UI空间,其实在App Store里面的%80以上的应用都用到了这个控件,所以就给大家介绍一下,前面的文章中也 ...

  7. iOS开发——开发必备OC篇&彩票实战之精华讲解

    彩票实战之精华讲解 在这段时间自己研究并学习关于彩票项目开发的时候遇到各种坑,各种技术点以前或许之前用过但是却用起来不是那么熟悉,所以没遇到一个重点的地方我就会记录一下,希望不会再有下次. 本文主要讲 ...

  8. iOS开发——UI篇OC篇&UITableView多项选择

    UITableView多项选择 自定义cell和取到相应的cell就行了 TableViewCell.h #import <UIKit/UIKit.h> @interface TableV ...

  9. iOS开发——网络实用技术OC篇&网络爬虫-使用青花瓷抓取网络数据

    网络爬虫-使用青花瓷抓取网络数据 由于最近在研究网络爬虫相关技术,刚好看到一篇的的搬了过来! 望谅解..... 写本文的契机主要是前段时间有次用青花瓷抓包有一步忘了,在网上查了半天也没找到写的完整的教 ...

随机推荐

  1. [转] AOP面向切面编程

    AOP面向切面编程 AOP(Aspect-Oriented Programming,面向切面的编程),它是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术. ...

  2. Hadoop 问题 & 解决

    1.将旧版本hadoop升级后,如从hadoop-1.1.2升级到hadoop-1.2.1,会发现使用start-all.sh命令,没有办法启动namenode,即jps,发现没有namenode 原 ...

  3. Encapsulating Data

    [Encapsulating Data] The synthesized methods follow specific naming conventions: The method used to ...

  4. Primitive Objects

    [Primitive Objects] Unity can work with 3D models of any shape that can be created with modelling so ...

  5. C#中字符串与byte[]相互转换

    字符串转换为byte[] 给定一个string,转换为byte[],有以下几种方法. 方法1: static byte[] GetBytes(string str) { byte[] bytes = ...

  6. spring 的properties解析

    一般使用PropertyPlaceholderConfigurer来替换占位符,例如: <bean class="org.springframework.beans.factory.c ...

  7. poj 1797 Heavy Transportation(Dijkstar变形)

    http://poj.org/problem?id=1797 给定n个点,及m条边的最大负载,求顶点1到顶点n的最大载重量. 用Dijkstra算法解之,只是需要把“最短路”的定义稍微改变一下, A到 ...

  8. to_number,Extract oracle的关键字

    to_number(Extract(year from 字段名)) 简介:获取时间字段的年份后转换为数字

  9. window 方法:延时 和 重复

    window 方法 var timer = setTimeout(closeFunc,10*1000); function closeFunc(){ alert('close'); }

  10. 转载linq to sql 的详解

    [转]LINQ To SQL 语法及实例大全 2011-11-26阅读38651 评论9 LINQ to SQL语句(1)之Where Where操作 适用场景:实现过滤,查询等功能. 说明:与SQL ...