前言:这个小实例项目是完完全全以MJ视频传授的优化方案一步一个思路从零开始敲出代码的,而且每一步都有思路,都有逻辑所以然。敲代码讲究思路,我个人不建议记忆太多东西,反正我记性很差的。

小贴士:文章末尾有 项目资源 的百度云下载链接。

小实例项目--添加商品和商品名

好,现在完成了 plist文件的数据 --转换到--> 集合对象存储这些数据 ,接下来根据MVC的原则,我们当然需要一个Model(数据模型),

所以需要新建数据模型类,同时这里需要类前缀,类前缀设置一下可以一劳永逸:

设置类前缀:

新建数据模型:

到这里MVC中的Model准备好了,接着就要准备View了:

为了能够将控件给多个控制器共享

  • 继承自系统自带的控件,写一个属于自己的控件
  • 目的:封装控件内部的细节,不让外界关心
  • 步骤:
    • 新建一个继承UIView的类
    • 在init方法中添加子控件
    • 在layoutSubViews方法中设置子控件的frame
      • 一定要调用[super layoutSubView]
    • 提供一个模型属性(我个人发现:其实可以直接通过初始化方法传入局部参数,然后局部就使用这个模型属性),重写模型属性的set方法
      • 在set方法中取出模型属性,给对应的子控件赋值
  1. 因为继承自UIView,所以就具有UIView的属性。
  2. 比如frame属性,比如addSubView方法,以及可以重写专门用来布局子控件的layoutSubViews方法

layoutSubviews这个方法专门用来布局子控件,设置子控件的frame

  1. -(void)layoutSubviews
  2. {
  3. //这个方法必须要实现
  4. [super layoutSubviews];
  5. }

思考一下自定义控件在这个MVC综合项目应该怎么去自定义和使用:

  1. 1、首先因为组合模式,所以需要内部创建两个需要组合的控件:
  2. UIImageViewUILabel这两个子控件。
  3. 2、在什么地方创建这两个组合的控件呢?
  4. 在初始化方法中创建最合适。因为我们需要一创建这个自定义控件,就创建好了两个子控件。
  5. 3、另外,创建子控件需要模型数据model,因为一个UIImageView对应一个icon,一个UILabel对应一个商品名称,
  6. 而一个icon和一个UILabel是存储在一个model模型对象中的,所以,还需要创建一个模型对象的引用。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

讨 论:接下来说说为什么要在layoutSubView中,实现子控件的frame的设置,而不仅仅只在初始化方法里通过WithFrame: (CGRect)frame传入需要的父控件frame,然后通过父控件的frame设置子控件的frame呢?或者是通过声明一个property的 Frame属性,然后重写这个frame的set方法:

  1. 1 -(void)setFrame:(CGRect)frame
  2. 2 {
  3. 3 _frame = frame;
  4. 4 }

解 答:因为按照"讨论"的问题说法,不管外部通过初始化方法里传入父控件的frame,还是通过点访问符号或者是setFrame方法传入父控件的 frame都会调用layoutSubView方法,还有,在这个父控件的类中,初始化方法内部也要通过点访问符号调用自己的frame,只要点访问 frame都会调用layoutSubView方法,那么还不如直接在layoutSubView中写好设置子控件的布局位置。

另外:只要 一个控件的frame一变化,就会调用layoutSubView方法,这一点可以通过按钮点击事件,按钮监听一个改变组件的frame属性方法,这个方 法实现执行点击一次就改变这个控件的frame,然后在这个控件的类中的layoutSubView方法中写出打印frame的方法。

所以下面的代码基本不变化的思路就是,在父控件类的初始化方法中仅仅通过alloc-init来初始化子控件,然后在layoutSubView方法中初始化子控件的frame。

九宫格算法思路:

  1. 逻辑过程描述:每点击一次,添加一次图片,而且一行添加超过三次会换行,而且所占位置是父控件的行距离的三分之一。
  2. 需要解决问题细分三点:
  3. 1、每点击一次,添加一次图片
  4. 2、一行添加超过三次换行
  5. 3、所在位置是父控件行距离的三分之一

问题1解决思路:每点击一次,变化的是子控件添加1,所以可以通过父控件的子控件数来获取动态数据数值 n :

  1. int n = (int)self.shopsBoxView.subView.count

问题2解决思路:只要涉及到换行可以考虑求余数或者求模:

  1. //行数:row 列:column
  2. int row = n / 3;
  3. int column = n % 3;
  1. 然后是九宫格的这个格子的坐标
  2. (0,0)(0,1)(0,2)
  3. (1,0)(1,1)(1,2)
  4. (2,0)(2,1)(2,2)
  5. 结合对应子控件的个数的次第
  6. 123
  7. 456
  8. 789
  • 简单讲解一下逻辑关系,当我们第一次添加子控件之前,子控件个数count = 0,对应即将添加子控件的坐标是(0,0),所以:count = 0 -> (0,0);count = 1 -> (0,1);count = 2 -> (0,2)...以此类推

总结:用当前子控件个数,通过求得行列的算法,就能算出对应的九宫格格子的坐标

问题3的解决思路:

通过问题二获取的坐标可以对应算出各需要添加的子控件坐标位置。

上代码算法思路(另外直接写完了按钮在数量达到目标数值会自动变成disEnable状态):

以上错误更正:九宫格算法的代码行数应该是75~92行。

然后回到HYUIView类中,进行最后的优化。

 到这里,纯代码最优的项目代码就完成了,其实如果用xib文件的话,会让整个项目开发更简单而且更完美,下一博文进行在这个项目的基础上分解xib的使用以及如果优化这个项目,最后让你感觉到开发IOS真的很爽。
 
纯代码源文件下载链接: http://pan.baidu.com/s/1qW3TNu0 密码: ymhc
纯代码资源文件下载链接:http://pan.baidu.com/s/1dDsKQ7B 密码: 1squ
 
 
 
 
 
 
 
 
 
 
 

IOS之UI--小实例项目--添加商品和商品名(纯代码终结版)的更多相关文章

  1. 在iOS开发中,给项目添加新的.framework

    首先需要了解一下iOS中静态库和动态库.framework的概念 静态库与动态库的区别 首先来看什么是库,库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别人使用. 什么时候我 ...

  2. IOS之UI--小实例项目--添加商品和商品名

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  3. IOS之UI--小实例项目--添加商品和商品名(使用xib文件终结版) + xib相关知识点总结

    添加商品和商品名小项目(使用xib文件终结版) 小贴士:博文末尾有项目源码在百度云备份的下载链接. xib相关知识点总结 01-基本使用 一开始使用xib的时候,如果要使用自定义view的代码,就需要 ...

  4. 【iOS开发】多屏尺的自动适配 AutoLayout (纯代码方式)

    关于AutoLayout,最早从iOS6开始引入使用.   主要功能是使用约束,对视图进行相对布局,以适应不同屏尺的变换.   网上大量的资料都在介绍xib和storyboard,如何使用AutoLa ...

  5. ios手势复习值之换图片-转场动画(纯代码)

    目标:实现通过手势进行图片的切换   通过左扫右扫 来实现(纯代码) 添加三个属性 1uiImageView 用来显示图片的view 2 index 用来表示图片的索引 3 ISLeft 判断是不是向 ...

  6. IOS开发之小实例--创建一个简单的用于视频录制和回放的应用程序

    前言:还是看了一下国外的入门IOS文章:<Create a Simple App for Video Recording and Playback>,主要涉及视频录制和回放的功能的基本实现 ...

  7. IOS开发之小实例--使用UIImagePickerController创建一个简单的相机应用程序

    前言:本篇博文是本人阅读国外的IOS Programming Tutorial的一篇入门文章的学习过程总结,难度不大,因为是入门.主要是入门UIImagePickerController这个控制器,那 ...

  8. iOS开发:为xcode项目添加git仓储

    现在apple官网下载Command Line Tools 对应mac版本和xcode版本,记录地址:https://developer.apple.com/downloads/ 找到mac的终端,c ...

  9. 【UI】为项目添加类似于淘宝筛选列表勾选的ui-choose

    jQuery下载的地址:http://www.htmleaf.com/jQuery/Form/201512182916.html GitHub地址:https://github.com/wangxin ...

随机推荐

  1. 将XmlDocument转换成XDocument

    XmlDocument xml=new XmlDocument(); xml.LoadXml(strXmlText); XmlReader xr=new XmlNodeReader(xml); XDo ...

  2. tiny4412的中断资源连接关系示意图

    在tiny4412的设备树中可以发现,中断资源是以树的形式呈现的,下面是我画的一张图,大致描述了tiny4412上中断资源的连接关系. 可以到http://pan.baidu.com/s/1ge0sz ...

  3. Pagekit – 现代化技术构建的轻量的 CMS 系统

    Pagekit 是一个模块化,轻量的 CMS 系统,基于现代化的技术,如 Symfony 组件和 Doctrine.它提供了一个很好的平台,用于主题和延伸开发.Pagekit 为您提供了工具来创造美丽 ...

  4. Android的Activity生命周期

    Android的Activity就相当于Windows Form中的Form,它的创建和销毁也是有一个生命周期的.主要经过这么7个阶段:   创建Activity:onCreate() 启动Activ ...

  5. C#设计模式——组合模式(Composite Pattern)

    一.概述 在软件开发中,我们往往会遇上类似树形结构的对象体系.即某一对象既可能在树形结构中作为叶节点存在,也可能作为分支节点存在.比如在文件系统中,文件是作为叶节点存在,而文件夹就是分支节点.在设计这 ...

  6. 整理的有用的一些EF的CommonDAL小封装

    CommonDAL封装: using System; using System.Collections.Generic; using System.Data.Entity; using System. ...

  7. Python入门笔记(9):元组

    一.元组特性 1.类似列表,但不可变类型,正因如此,它可以做一个字典的key2.当处理一组对象时,这个组默认是元组类型(老写错"元祖")3.所有的多对象,逗号分隔的,没有明确用符号 ...

  8. [转]在SqlServer 中解析JSON数据

      在Sqlserver中可以直接处理Xml格式的数据,但因为项目需要所以要保存JSON格式的数据到Sqlserver中在博客:Consuming JSON Strings in SQL Server ...

  9. sencha动态向容器里添加控件出现重叠问题

    sencha动态向容器里添加控件出现重叠问题原因是由于动态生成控件的id有重复导致的.(js取时间到毫秒来做id,放在for里面会出现几个控件id是相同的情况.).解决掉重复id的问题就好了. 版权声 ...

  10. 通过发布项目到IIS上,登录访问报系统找不到System.Web.Mvc

    我发布项目到IIs,通过IIS的端口来访问直接下面的错误