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. asp.net mvc源码分析-Action篇 IModelBinder

    我们首先还是看看ReflectedParameterBindingInfo的Binder属性吧: public override IModelBinder Binder {            ge ...

  2. font-size的探究

    整理网上的资料 font字体,用px,em,100%,rem?分什么情况考虑? 我们逐渐意识到,我们用px作为文字大小的单位,已经出现很多问题.最主要是体现在用户不能灵活的控制文字的大小. 对于大多数 ...

  3. 【转】What's the difference between simulation and emulation

    摘要:这2个单词 还是用英文解释,比较准确.按我的理解:simulation就是模拟,可以做些改变. emulation是仿真,是按照原来的样子进行部署,不可以改变. Yes, the concept ...

  4. html5_common.js

    (function(){ this.sendAjax = function(url,func,formData,type){ type = type || "POST"; //默认 ...

  5. HDOJ-ACM1009(JAVA) (传说中的贪心算法)分为数组实现 和 封装类实现

    转载声明:原文转自:http://www.cnblogs.com/xiezie/p/5564311.html 这个道题有几点要注意的: 数组存放的类型:float或double 打印的格式:(如果只是 ...

  6. 使用 XMPP 构建一个基于 web 的通知工具——转

    Inserting of file(使用 XMPP 构建一个基于 web 的通知工具.docx) failed. Please try again. http://www.ibm.com/develo ...

  7. 前端异步解决方案——mmDeferred

    Deferred是前端解决异步操作的一种编程范式,后来出现的Promise规范更是让其普适性大大提高.不过Promise规范也存在分岐.现在最流行的是Promise/A规范. Promise/A大致是 ...

  8. HDU 1525 Euclid's Game (博弈)

    Euclid's Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  9. CodeForces 710A King Moves (水题)

    题意:给定一个坐标,问你皇后有几个方向可以走. 析:直接格举那八个方向即可. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000 ...

  10. AFNetWorking3.0使用 自签名证书的https请求

    前几日,项目组出于安全角度的考虑,要求项目中的请求使用https请求,因为是企业内部使用的app,因此使用了自签名的证书,而自签名的证书是不受信任的,所以我们就需要自己来做证书的验证,包括服务器验证客 ...