在iOS的开发过程中,架构思想是很重要的一部分,目前的主流应该分为MVC与MVVM两种,在这里不做过多的区分,有兴趣的同学可以看看唐巧大神的一篇文章《被误解的MVC和被神化的MVVM》。
    UITableViewCell应该是iOS开发中使用最多的控件之一,MVC模式也是主流,那么将这两者结合起来,必然能大大的提升我们的代码质量。
    MVC模式,Model—View—Controller,按照这个逻辑,能使代码进行明确的分工,相应的类只干该干的事,这样不仅大大的提高了代码的耦合性,能便于后期的维护。
    那么首先,我们新建一个类,取名MyCell,继承自UITableViewCell类。我们在这个类里自定义我们想自定义的结构,以后在Controller只要给这个类新建对象就可以了。回想上一次的UITableViewCell的复用机制,我们不难想到初始化方法,我们给初始化方法做一次重写,代码如下:
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{

self = [superinitWithStyle:style reuseIdentifier:reuseIdentifier];

if (self) {

// Initialization code

[self createUI];

}

returnself;

}

这里我们给UI页面的定制,单独写成一个方法,然后去进行我们自己的定制

- (void)createUI{

_iconView = [[UIImageView alloc]initWithFrame:CGRectMake(5, 5, 70, 70)];

[self.contentView addSubview:_iconView];

_nameLabel = [[UILabel alloc]initWithFrame:CGRectMake(80, 5, 230, 25)];

_nameLabel.font = [UIFont systemFontOfSize:16];

_nameLabel.textColor = [UIColor blackColor];

[self.contentView addSubview:_nameLabel];

_priceLabel = [[UILabel alloc]initWithFrame:CGRectMake(80, 30, 230, 25)];

_priceLabel.font = [UIFont systemFontOfSize:14];

_priceLabel.textColor = [UIColor redColor];

[self.contentView  addSubview:_priceLabel];

_detailLabel = [[UILabel alloc]initWithFrame:CGRectMake(80, 55, 230, 25)];

_detailLabel.font = [UIFont systemFontOfSize:12];

_detailLabel.textColor = [UIColor grayColor];

[self.contentView addSubview:_detailLabel];

}

可以看到,我们在当前的cell上,自定义了一个UIImageView用来加载图片,三个UILable用来展示相应的信息。一般来说,Controller里面采用的是self.view addSubview的方式来加载控件,同样的,UITableViewCell也是一个View,但是它就不能用view ,而是用contentView来加载,这个以后再提。于是这样我们就能将我们需要的设计,在我们这个cell里实现了。

在日常的开发工作中,很少有将数据写死的,通常都是从后台通过请求接受数据,然后将数据再根据需要加载到相应的控件上,所以对于我们来说,控件是可变的,控件上的数据是可变的,这样的话,我们就将所需要的数据单独抽取出来建成一个模型。分析一下需求与代码,我们现在需要的是一个UIImageView的image与三个UILable的text信息,所以,我们将这些属性单独抽取出来作为我们这个cell的模型。

新建一个MyModel类,这个类继承自NSObject,里面放的就是我们cell的属性,代码如下:

@property (retain, nonatomic) UIImage *icon;

@property (copy, nonatomic) NSString *nameStr;

@property (copy, nonatomic) NSString *priceStr;

@property (copy, nonatomic) NSString *detailStr;

注意:因为我们这个类是需要让其他的类引用,并且是需要接受数据的,所以应该写在.h文件,interface下面。

到这里,我们的MVC的思想大致就出来了,但是还有一个问题,那就是如何让cell与自己的模型相关联起来。我们需要在cell中往外暴露一个方法,去接收模型,同样的原因,我们在cell的.h文件中声明这个方法:

- (void)customWithMyModel:(MyModel *)bm;

然后在cell的.m文件中来实现这个方法,参数类型就是我们自定义的这个模型类

- (void)customWithMyModel:(MyModel *)bm{

_iconView.image = bm.icon;

_nameLabel.text = bm.nameStr;

_priceLabel.text = bm.priceStr;

_detailLabel.text = bm.detailStr;

}

到这里为止,我们的自定义部分基本就结束了,接下来就是在Controller里面去使用我们自定义的Cell了

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

staticNSString *idt= @"idt";

MyCell *cell = [tableView dequeueReusableCellWithIdentifier:idt];

if (!cell) {

cell = [[MyCell alloc]initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:idt];

}

MyModel *mm= [_dataArrobjectAtIndex:indexPath.row-1];

//将数据模型传给cell,让cell设置图片及文字

[cell customWithMyModel:mm];

return cell;

}

这样就能创建一个我们自定义的,使用MVC思想架构的cell了,数据怎么接?那就是另外一篇笔记了哈哈。

MVC思想架构的简单自定义UITableViewCell的更多相关文章

  1. iOS开发UI篇—使用xib自定义UItableviewcell实现一个简单的团购应用界面布局

    iOS开发UI篇—使用xib自定义UItableviewcell实现一个简单的团购应用界面布局 一.项目文件结构和plist文件 二.实现效果 三.代码示例 1.没有使用配套的类,而是直接使用xib文 ...

  2. Node实现简单的注册时后端的MVC模型架构

    实现一个简单的注册界面后端MVC模型架构 第一步:在生成的express框架的app.js中添加一个路由,代码如下:var api = require('./routes/api'); app.use ...

  3. ios开发UI篇—使用纯代码自定义UItableviewcell实现一个简单的微博界面布局

    本文转自 :http://www.cnblogs.com/wendingding/p/3761730.html ios开发UI篇—使用纯代码自定义UItableviewcell实现一个简单的微博界面布 ...

  4. 服务器文档下载zip格式 SQL Server SQL分页查询 C#过滤html标签 EF 延时加载与死锁 在JS方法中返回多个值的三种方法(转载) IEnumerable,ICollection,IList接口问题 不吹不擂,你想要的Python面试都在这里了【315+道题】 基于mvc三层架构和ajax技术实现最简单的文件上传 事件管理

    服务器文档下载zip格式   刚好这次项目中遇到了这个东西,就来弄一下,挺简单的,但是前台调用的时候弄错了,浪费了大半天的时间,本人也是菜鸟一枚.开始吧.(MVC的) @using Rattan.Co ...

  5. Spring MVC内容协商实现原理及自定义配置【享学Spring MVC】

    每篇一句 在绝对力量面前,一切技巧都是浮云 前言 上文 介绍了Http内容协商的一些概念,以及Spring MVC内置的4种协商方式使用介绍.本文主要针对Spring MVC内容协商方式:从步骤.原理 ...

  6. MVC与WebForm的简单的比较

    MVC与WebForm的简单的比较 ASP 强制程序员将业务逻辑和展示页放到一个文件中 WebForm 允许程序员将业务逻辑与页面展示分开到不同的文件中,并且提供强大的开发平台来写  业务逻辑代码  ...

  7. MVC模块化架构

    全面解析ASP.NET MVC模块化架构方案 什么叫架构?揭开架构神秘的面纱,无非就是:分层+模块化.任意复杂的架构,你也会发现架构师也就做了这两件事. 本文将会全面的介绍我们团队在模块化设计方面取得 ...

  8. MVC思想概述

    一. 传统Model1和Model2 Model1:整个web应用几乎全部用JSP页面组成,JSP页面接收处理客户端请求,对请求处理后直接作出响应.用少量的javaBean来处理数据库链接,数据库访问 ...

  9. MVC思想概叙

    随着应用系统的逐渐增大,系统的业务逻辑复杂度是以几何的方式增长,在这种情况下,如果依然把所有的业务逻辑都放在JSP页面中,那将成为一场恶梦. MVC思想将应用中各个组件按照功能来进行分类,不同的组将使 ...

随机推荐

  1. 关于用Java写的贪吃蛇游戏的一些感想

    学习Java有那么一个月了,兴趣还是挺高的.然而最近老师布置的一个迷宫问题,着实让我头疼了一两个礼拜,以至于身心疲惫,困扰不安.无奈,暂且先放下这个迷宫问题,写个简单点的贪吃蛇程序,以此来提高低落的情 ...

  2. doGet和doPost的区别

    1.doGet和doPost的区别,在什么时候调用,为什么有时doPost中套用doGet 2.提交的form     method=Post就执行DOPOST,否则执行GOGET 套用是不管meth ...

  3. 一种无new创建对象的方法

    var L=function(){ var obj = { age:38, live:true, job:"web dev" }; obj.name = "zhouhui ...

  4. CSS浏览器兼容问题集-第一部分

    CSS对浏览器的兼 容性有时让人很头疼,或许当你了解当中的技巧跟原理,就会觉得也不是难事,从网上收集了IE7,6与Fireofx的兼容性处理方法并整理了一下.对于 web2.0的过度,请尽量用xhtm ...

  5. FloatingActionButton 完全解析[Design Support Library(2)]

    一.简单使用 布局: <android.support.design.widget.FloatingActionButton android:layout_width="wrap_co ...

  6. jQuery UI Datepicker&Datetimepicker添加 时-分-秒 并且,判断

    jQuery UI Datepicker时间(年-月-日) 相关代码: <input type="text" value="" name="ad ...

  7. MySQL--query-cache

    知识准备: 1.mysql 的query-cache是什么?  mysql可以把执行完成的select 语句和这个select 语句对应的结果集缓存起来:下次再用调用相同的select 语句时就直接返 ...

  8. 大端模式&小端模式、主机序&网络序、入栈地址高低问题

    一.大端模式&小端模式 所谓的“大端模式”,是指数据的低位(就是权值较小的后面那几位)保存在内存的高地址中,而数据的高位,保存在内存的低地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处 ...

  9. 开机时候系统总是提醒Android系统更新

    今天刷了个android的rom,平常没有经常刷机,对这个也不是特别了解. 但是刷完开机,显示系统升级,一开始都是18个app,后来捣鼓了几次,安装了几个常用的软件,居开机的时候,升级的app需要90 ...

  10. Keil中Memory Model和Code Rom Size说明

    C51中定义变量时如果省略存储器类型,Keil C51编译系统则会按编译模式SMALL.COMPACT和LARGE所规定的默认存储器类型去指定变量的存储区域,无论什么存储模式都可以声明变量在任何的80 ...