实现:彩票设置界面
源代码下载地址:点击打开链接
1、我的彩票(设置界面) --- 重要
1.1 界面
1.2 搭建设置界面分析
1> 静态单元格:一个Cell一个Cell的改,太麻烦,而且不灵活
2> plist文件:配置plist文件太费时间
3> 分析数据结构:大数组里面存放两个小数组,小数组存放每一行的模型
1. 大数组:告诉tableView有多少组tableView:numberOfSectionsInTableView:
2. 小数组:告诉tableView每一组多少行tableView:numberOfRowsInSection:
3. 小数组里存:每一行长什么样tableView:cellForRowAtIndexPath:
1.3 自定义设置控制器(代码跳转)
注1:单独弄一个设置模块,处理业务逻辑,而且以后可以直接拿来使用
注2:自定义ILSettingViewController,由于是分组模式,重写init方法,return [superinitWithStyle:UITableViewStyleGrouped];
注3:点击设置后代码跳转
[self.navigationControllerpushViewController:settingVc animated:YES];
1.4 自定义Cell模型(ILSettingItem(title, icon))
1.5 自定义组模型ILSettingGroup(header, footer,items)
每一组有头部标题和尾部标题和有多少行Cell
1> 在ILSettingViewController中,添加模型数组,懒加载方法中先随便设置两组数据
2> 根据上面的模型,重写tableView的数据源方法和Cell样式方法,进行测试
1.6 自定义Cell(ILSetttingCell)
设计步骤:先设计模型,在封装视图,因为视图是根据模型展示的
1> 添加模型ILSettingItem的setter方法
2> 类方法:+(instancetype)cellWithTableView:(UITableView *)tableView;
3> accessoryView处理(Cell右边显示箭头(跳转),还是开关)
由模型决定,tableView上的所有显示
方法一:给ILSettingItem模型添加一个枚举,不够面向对象
方法二:应该把每一个Cell的类型都对应一个模型,因为不同的Cell类型不同的操作。箭头的Cell一般需要跳转,开关的不需要跳转,箭头应该比开关多添加一个属性,跳转的控制器类型Class。
4> 自定义箭头模型(ILSettingArrowItem),继承ILSettingItem,添加一个跳转的控制器的属性,并提供一个类方法
注1. Class用assign,因为只是表征需要跳转的控制器类型,不需要管理内存在的问题
注2. 为什么用Class,因为Class写错类型就会报错,如果用NSString来表征跳转的控制器类名,会存在手误的情况,不能及时检查错误
5> 自定义开关模型(ILSettingSwitchItem),继承ILSettingItem。
6> 重写setter模型的方法里,根据Item的类型判断Cell上显示什么样的accessoryView
7> Cell懒加载UIImageView和UISwitch,注意用strong,否则会被销毁,没有其他视图强引用他,没有addSubviews
注:只要没有add的控件,都需要强引用
注:ILSettingArrowItem添加类方法快速创建模型
1.7 Cell的跳转
实现tableView代理方法didSelectRowAtIndexPath
1> 根据模型判断是否需要跳转
2> 是否有destVcClass属性
3> 通过类名创建控制器对象,跳转。[[arrowItem.destVcClassalloc] init];
2、检查更新
1> 点击更新Cell,做一些事情,而不是跳转,最蠢的办法根据角标去判断,点击了哪一行
2> 更新操作交给模型去管理,让模型保存一个功能,怎么保存代码?给ILSettingItem添加一个block属性,用block保存一段代码,每一行Cell应该都会有操作,因此给ILSettingItem(父类)添加block属性,这样子类都有这个block属性
typedef void(^ILSettingItemOption)();
// 保存一段功能,在恰当的时候调用
@property (nonatomic, copy) ILSettingItemOption option;
3> 完善更新模型
1. 思路:只有服务器才知道是否有最新数据,因此需要发送网络请求
2. 更新功能步骤:发送网络请求(当前手机版本) -> 服务器返回数据(是否需要更新) -> 弹框提示用户
3. 如果需要更新跳到AppStore更新
4> 点击Cell的时候调用block
5> 更新Cell一直选中状态,应该点击一行的时候,立即取消
注:以上已封装好模型,是否需要跳转,需要执行什么功能,已经全部交给模型去管理,设置界面以后可以拿来直接用,修改模型即可!!!
3、产品推荐
3.1 UICollectionViewController --- 重要
1> 使用UICollectionViewController,查看头文件和UITableViewController一样,有数据源和代理
2> UITableView每一行是UITableViewCell,UICollectionView每一个是UICollectionViewCell
3> 实现数据源,
1. numberOfSectionsInCollectionView:返回UICollectionView有多少组
2. numberOfItemsInSection:返回一组多少个
3. cellForItemAtIndexPath:返回一个Cell长什么样
4. section:哪一组 item:哪一个
注1:使用UICollectionViewCell必须先注册,因为init方法没有提供标识符的构造方法
注2:注册Cell,在viewDidLoad注册一次
注3:必须传入布局,告诉他怎么布
注4:使用流水布局 UICollectionViewFlowLayout,封装到控制器里面
注5:设置UICollectionViewCell的尺寸和位置,通过layout布局设置
3.2 解析json数据
完成产品推荐(分析产品json数据),以后的思路都是这样的:解析数据,转换模型,描述界面,传递模型给界面,展示到视图
1> 解析json数据,json最外面是[],表示这是个json数组,解析出来也是数组
2> 创建模型,提供类方法,不能用KVC,id比较特殊
3> 自定义Cell,传递模型
4> 注册XIB的Cell
5> 设置Cell里UIImageView的圆角属性,设置Cell的尺寸。
6> 监听点击
7> 导航条的标题:在push之前的时候就设置,拿到模型的title直接设置vc.title = arrowItem.title;
4、推送和提醒
4.1 抽取父类
分析推送和提醒界面外观:跟设置界面一样的Cell,只需要给Cell传递一个模型,就自动生成一个界面了
注1:推送和提醒的界面(以及帮助、分享等界面)与设置界面基本一致,都是一个tableView,都可以将ILSettingViewController中的代码复制过来,修改显示模型即可,因此需要抽取出父类(ILBaseTableViewController),将其他控制器继承自ILBaseTableViewController即可!!!
注2:在ILBaseTableViewController中实现数据源、Cell明细、点击某一行方法
4.2 配置模型
接下来只需要给控制器配置不同的模型,显示即可,配置中奖提醒,中奖动画,比分直播(ILAwardPushViewController, ILAwardAnimationViewController,ILScoreNoticeViewController)
4.3 比分直播提醒
控制器比较特殊,Cell右边有UILabel
1> 相当于又多了一个模型,自定义ILSettingLabelItem,添加text属性,用于显示UILabel文字
2> 修改ILSettingCell,根据模型,判断是否懒加载UILabel,UILabel必须设置尺寸
_labelView.bounds = CGRectMake(0, 0, 100, 44);
_labelView.textColor = [UIColor redColor];
_labelView.textAlignment = NSTextAlignmentRight;
3> 同上配置比分直播的模型即可
4> 比分直播label处理
1. 从下往上钻的是什么,键盘才有这样的效果,也就是点击label弹出键盘
2. 什么东西能弹出键盘,textField成为第一响应者
3. 创建一个textField,不需要显示,目的就是弹出键盘
4. 修改键盘inputView为UIDatePicker
5. 监听UIDatePicker的滚动,改变ILSettingLabelItem的值
6. 刷新表格,更新界面
5、数据存储
5.1 自定义存储工具类
5.2 将数据存储封装到模型的setter方法中
1> 存储Cell的accessoryView状态,用[NSUserDefaults standardUserDefaults]快速存储,别忘记同步synchronize
2> ILSettingLabelItem的text
1. 重写模型setText方法,在设置的text的时候就存储。
2. key:用模型的title属性,目的知道是哪个cell存储了,每个cell都有title
3> ILSettingSwitchItem开关的状态
1. 监听switch的改变
2. 给模型添加一个属性,开关属性off
3. 重写setOff方法,设置的时候就存储
4> 怎么读取,重写两个模型的setTitle方法,在设置title的时候就读取一次,给对应的属性赋值。