彩票实战之精华讲解

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

本文主要讲解笔者在彩票实战中遇到的一些重要的技术点和思路。

下面就来总结一下

一:设置Cell右边显示的类型:

方法1:使用枚举

模型中:定义一个枚举类型

 typedef enum : NSInteger {

     iCocosSettingCellRightViewTypeArrow,

     iCocosSettingCellRightViewTypeSwitch

 }iCocosSettingCellRightViewType;

定义一个枚举类型对应的属性

@property (nonatomic, assign) iCocosSettingCellRightViewType type;

cell中

     if (item.type == iCocosSettingCellRightViewTypeArrow) {

         cell.accessoryView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"awardAnimCheckMark"]];

         cell.selectionStyle = UITableViewCellSelectionStyleDefault;

     } else if (item.type == iCocosSettingCellRightViewTypeSwitch) {

         cell.accessoryView = [[UISwitch alloc] init];

          cell.selectionStyle = UITableViewCellSelectionStyleNone;

     } else {

         cell.accessoryType = UITableViewCellAccessoryNone;

         cell.selectionStyle = UITableViewCellSelectionStyleNone;

     }

创建控制器之后设置对应的类型:

item1.type = iCocosSettingCellRightViewTypeSwitch;

方法2:使用子类模型:

创建两个字类模型

iCocosSettingArrowModel : iCocosSettingCellModel

iCocosSettingSwitchModel : iCocosSettingCellModel

在cell中对应的模型属性的setter方法中设置数据之后判断类型并且设置对应的属性

(这里的self.arrawImageView;/self.openSwitch;是我们在之前懒加载的时候已经创建好的)

     if (item.icon) {

         self.imageView.image = [UIImage imageNamed:item.icon];

     }

     self.textLabel.text = item.title;

     self.detailTextLabel.text = item.subTitle;

     if ([item isKindOfClass:[iCocosSettingArrowModel class]]) {

         self.accessoryView = self.arrawImageView;

         self.selectionStyle = UITableViewCellSelectionStyleDefault;

     } else if ([item isKindOfClass:[iCocosSettingSwitchModel class]]){

         self.accessoryView = self.openSwitch;

         self.accessoryType = UITableViewCellSelectionStyleNone;

     }

懒加载:

 -(UIImageView *)arrawImageView

 {

     if (_arrawImageView == nil) {

         _arrawImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"CellArrow"]];

     }

     return _arrawImageView;

 }

 -(UISwitch *)openSwitch

 {

     if (_openSwitch == nil) {

         _openSwitch = [[UISwitch alloc] init];

     }

     return _openSwitch;

 }

创建对应控制器的时候使用对应的子类模型

     iCocosSettingArrowModel *item1 = [iCocosSettingArrowModel cellWithIcon:@"handShake" title:@"提醒"];

     iCocosSettingSwitchModel *item2 = [iCocosSettingSwitchModel cellWithIcon:@"handShake" title:@"阿三发生的"];

二:控制器跳转:

方法1:使用属性

模型中的属性

在tableView的选中的方法中判断是否有值,有值就使用这个值去转换为类并且跳转:

     if (item.destinationControllerClass) {

         id dest = [[item.destinationControllerClass alloc] init];

         [self.navigationController pushViewController:dest animated:YES];

     }

使用模型创建好控制器之后设置对应的目的控制器类名:

     iCocosSettingArrowModel *item1 = [iCocosSettingArrowModel cellWithIcon:nil title:@"司法手段"];

     item1.destinationControllerClass = [iCocosNoticePushController class];

这里就可以实现 跳转了!

      

方法2:使用Block

在模型中创建Blobk及属性

//使用block传值

@property (nonatomic, strong) void(^operationBlock)(NSIndexPath *indexpath);

//block创建方法二:

 //typedef void(^operationBlock)(NSIndexPath *indexpath); //在最上面写

 //@property (nonatomic, copy) operationBlock block;  //属性

判断:在tableView的选中的方法中判断是否有值,就是知否执行了这个block:

     // 判断下有木有事情,就判断下block有没有值

     if (item.operationBlock) {

         // 执行保存的代码

         item.operationBlock(indexPath);

         return;

     }

在创建的时候就不需要实现前面的属性值,直接使用block,在block里面保存,让好自己去执行久可以:

  iCocosSettingArrowModel *item1 = [iCocosSettingArrowModel cellWithIcon:nil title:@"司法手段"];

 //    item1.destinationControllerClass = [iCocosNoticePushController class];

     __weak typeof(self) weakSelf = self;

     // 在block中最好不要直接访问成员属性

     item1.operationBlock = ^(NSIndexPath *indexPath){

         iCocosNoticePushController *vc = [[iCocosNoticePushController alloc] init];

         vc.view.backgroundColor = [UIColor redColor];

         vc.title = @"asldjasd";

         [weakSelf.navigationController pushViewController:vc animated:YES];

         // self -> _groups

         NSLog(@"%@",weakSelf.groups);

     };

      

三:实现Check对应的Cell,并且实现单选(使用通知)

创建两个字类模型

iCocosSettingCheckModel : iCocosSettingCellModel

同样:和上面一样在cell中的item的setter方法中判断对应的类型,并且设置,下面懒加载的值:

     else if ([item isKindOfClass:[iCocosSettingCheckModel class]]) {

         self.accessoryView = self.iCocosCheck;

         self.selectionStyle = UITableViewCellEditingStyleNone;

     }

懒加载

 -(UIButton *)iCocosCheck

 {

     if (_iCocosCheck == nil) {

         _iCocosCheck = [UIButton buttonWithType:UIButtonTypeCustom];

         _iCocosCheck.backgroundColor = [UIColor lightGrayColor];

         [_iCocosCheck setImage:[UIImage imageNamed:@"awardAnimCheckMark"] forState:UIControlStateSelected];

         [_iCocosCheck sizeToFit];

     }

     return _iCocosCheck;

 }

使用模型创建的时候,直接使用我们创建的子模型就可以:


     iCocosSettingCheckModel *item1 = [iCocosSettingCheckModel cellWithIcon:nil title:@"饿噶但是 v"];

     iCocosSettingCheckModel *item2 = [iCocosSettingCheckModel cellWithIcon:nil title:@"饿噶但是 v"];

使用通知实现单选:

创建一个通知名:

//cell的iCocosCheck选中的通知

#define  iCocosCheckSelectionNotification @"iCocosCheckSelectionNotification"

创建一个按钮实现单选:

@property (nonatomic, strong) UIButton *iCocosCheck;

在判断类型的时候如果类型符合久添加一个通知:

     else if ([item isKindOfClass:[iCocosSettingCheckModel class]]) {

     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(iCocosCheckSelection:) name:iCocosCheckSelectionNotification object:nil];

         self.accessoryView = self.iCocosCheck;

         self.selectionStyle = UITableViewCellEditingStyleNone;

     }

实现通知方法:

 -(void)iCocosCheckSelection:(NSNotification *)noti

 {

     id checkCell = noti.userInfo[@"CheckCell"];

     if (checkCell != self) {

         self.iCocosCheck.selected = NO;

     }

 }

在tableView的选中方法中判读是否是我们对应的类型,如果是则获取选中的行,并且设置对应的按钮取反,然后发布一个通知:

     if ([item isKindOfClass:[iCocosSettingCheckModel class]]) {

         iCocosSettingCell *cell = (iCocosSettingCell *)[tableView cellForRowAtIndexPath:indexPath];

         if (!cell.iCocosCheck.selected) {

 //            if (cell.iCocosCheck.selected == nil) {

             cell.iCocosCheck.selected = !cell.iCocosCheck.selected;

             NSDictionary *userInfo = @{@"CheckCell":cell};

             [[NSNotificationCenter defaultCenter] postNotificationName:iCocosCheckSelectionNotification object:nil userInfo:userInfo];

         }

     }

在dealloc里面移除通知

 -(void)dealloc

 {

     [[NSNotificationCenter defaultCenter] removeObserver:self];

 }

四:实现开关显示和隐藏cell

方法1:直接判断:

首先在对应的控制器里面实现对应的CellForRowAtIndexpath方法,并且,实现父类的方法,判断如果是对应的Switch行(需要去操作的行就添加一个点击事件),


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

 {

     iCocosSettingCell *cell = (iCocosSettingCell *)[super tableView:tableView cellForRowAtIndexPath:indexPath];

     ) {

         [cell.openSwitch addTarget:self action:@selector(switchChange:) forControlEvents:UIControlEventValueChanged];

     }

     return cell;

 }

实现点击事件的方法

判断如果打开就添加进去,如果没有关闭就从里面删除,同时实现刷新数据

 -(void)switchChange:(UISwitch *)swit

 {

     if (swit.isOn) {

         [self.groups addObject:self.group2];

     } else {

         [self.groups removeObject:self.group2];

     }

     [self.tableView reloadData];

 } 

在这里之前,

  • 第一:需要讲对应(或者基本)控制器里面将openSwitch暴露在头文件中

@property (nonatomic, strong) UISwitch *openSwitch;

  • 第二:在这个类中有添加组数据的(第二组),需要定义一个组模型属性来记录一下,而在创建好第二组的行之后不添加只是先记录住他:
    _group2 = group;

 //    [self.groups addObject:group];

然后在开关监听的方法中添加和删除

方法2:使用block判断

判断开关并且实现相应的功能:使用block在添加第一行的时候使用第一行的item去实现操作显示和隐藏

在基础的控制器中声明并且创建一个block开关属性

 //switch开关状态改变的block

 typedef void (^SwitchChangeBlock)(BOOL isOn);

 @property (nonatomic, copy) SwitchChangeBlock switchChangeBlock; /**< switch开关状态改变的block */

在创建懒加载switch的时候为Switch添加点击事件

        // 添加 “开关状态改变” 的监听

         [_mySwitch addTarget:self action:@selector(switchChange:) forControlEvents:UIControlEventValueChanged];

实现开关事件改变 的方法:

 #pragma mark 开关的触发事件

 -(void)switchChange:(UISwitch *)mSwitch{

     // 通过block的形式,把开关的状态告诉"控制器"

     if([self.item isKindOfClass:[XMGSettingSwitchItem class]]){

         XMGSettingSwitchItem *switchItem = (XMGSettingSwitchItem *)self.item;

         // 试用block

 #warning 如果有block值,才可以调用block

         if(switchItem.switchChangeBlock){

             switchItem.switchChangeBlock(mSwitch.isOn);

         }

     }

 }

同样同上面:

一:创建第二组的cell之后不加到数组而是新建一个groups数组来记录,这里添加和移除是在添加第一行之后使用第一行的对象来操作保存在block里面,并且实现显示和隐藏

 @property (nonatomic, strong) iCocosSettingGroupModel *group2;

     _group2 = group;

 //    [self.groups addObject:group];

在添加第一行之后,使用block实现显示和隐藏:

#warning 定义一个弱引用的变量,防止block内部的循环引用

  • 1.__weak XMGPrizeAnimationViewController *weakVc = self;
    1. typeof(self) 返回一个对象类型
    2. typeof(self) == XMGPrizeAnimationViewController
    3. __weak typeof(self) weakVc = self;

下面写也是一个弱引用,这种写法是在MRC环境下写

  • 2. __unsafe_unretained typeof(self) weakVc = self;
    __weak typeof(self) weakVc = self;
      添加 开关状态改变后 的操作 到block

     item.switchChangeBlock = ^(BOOL isOn){

         if (isOn) {// 显示第二组数据

             [weakVc.groups addObject:weakVc.group2];

         }else{//隐藏第二组的数据

             [weakVc.groups removeObject:weakVc.group2];

         }

         //刷新

         [weakVc.tableView reloadData];

     };

      

给tableViewCell添加进入动画:

 //每次点进去都会刷新界面

 - (void)viewWillAppear:(BOOL)animated

 {

     [super viewWillAppear:animated];

     [self.tableView reloadData];

 }

 -(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath

 {

     //偏移

     cell.transform = CGAffineTransformMakeTranslation(self.view.frame.size.width, );

     //还原

     [UIView animateWithDuration:0.5 animations:^{

         cell.transform = CGAffineTransformIdentity;

     }];

 }

iOS开发——开发必备OC篇&彩票实战之精华讲解的更多相关文章

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

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

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

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

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

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

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

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

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

    UITableView设置界面完整封装(一) 简单MVC实现UITableView设置界面分组数据显示 一:模型 1:cell模型 /** 描述cell图片 */ @property (nonatom ...

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

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

  7. iOS开发——高级技术OC篇&运行时(Runtime)机制

    运行时(Runtime)机制 本文将会以笔者个人的小小研究为例总结一下关于iOS开发中运行时的使用和常用方法的介绍,关于跟多运行时相关技术请查看笔者之前写的运行时高级用法及相关语法或者查看响应官方文档 ...

  8. iOS开发——网络实用技术OC篇&网络爬虫-使用java语言抓取网络数据

    网络爬虫-使用java语言抓取网络数据 前提:熟悉java语法(能看懂就行) 准备阶段:从网页中获取html代码 实战阶段:将对应的html代码使用java语言解析出来,最后保存到plist文件 上一 ...

  9. iOS开发——UI精选OC篇&UIApplication,UIWindow,UIViewController,UIView(layer)简单介绍

    UIApplication,UIWindow,UIViewController,UIView(layer)简单介绍 一:UIApplication:单例(关于单例后面的文章中会详细介绍,你现在只要知道 ...

随机推荐

  1. offer--链表反转和从尾到头打印链表

    这个是高频的面试题,今天总结了一些.反转链表用三个指针实现,返回新链表的头节点:而从尾到头打印,应用栈实现,返回vector整个链表. //题目描述 // //输入一个链表,反转链表后,输出链表的所有 ...

  2. R工作空间

    工作空间,指的是你现有的R语言工作环境,它包括了任何一个用户定义的对象,比如:向量,矩阵,数据结构,列表,方法等.在一个R会话结束的时候,你可以保存现有的工作空间的映像,在下一次R启动的时候,该工作空 ...

  3. Maven安装与全局profile配置

    Maven 3.2 需要 JDK 1.6, Maven 3.0/3.1 需要 JDK 1.5 · 解压. · 环境变量 M2_HOME · M2 = %M2_HOME%\bin 同时也添加到PATH ...

  4. IOS列表实现动态多列

    . //图片列表 NSMutableArray *pictureList; //分组列表 NSMutableArray *indexArr; - (UITableViewCell *)tableVie ...

  5. 《学习OpenCV》练习题第四章第七题abc

    题外话:一直是打算把这本书的全部课后编程题写完的,中间断了几个月,一直忙于其他事.现在开始补上. 这道题我不清楚我理解的题意是不是正确的,这道题可以练习用OpenCV实现透视变换(可以用于矫正在3维环 ...

  6. 第二百零七天 how can I坚持

    都这么一大把年纪了,还没正事,哎.. mysql ifnull(expr,expr),oracle nvl();去null函数. 每天也没什么事. 哎,每天 也总有那么点事. 刘松.李承杰,都是些什么 ...

  7. SpringMVC处理Date类型的成员变量方法

    原文链接:http://www.tuicool.com/articles/aYfaqa 在使用 SpringMVC 的时候,我们可能需要将一个对象从 View 传递给 Controller .而当这个 ...

  8. 【多线程同步案例】Race Condition引起的性能问题

    Race Condition(也叫做资源竞争),是多线程编程中比较头疼的问题.特别是Java多线程模型当中,经常会因为多个线程同时访问相同的共享数据,而造成数据的不一致性.为了解决这个问题,通常来说需 ...

  9. 【132】iPad使用相关问题

    1.想iPad中导入音乐文件,保留原音乐文件名称 [方法]需要删除音乐文件中的“标题”和“参与创作的艺术家”,直接删除的话,效率比较低,需要借助一款软件——foobar2000,选中导入的文件,然后属 ...

  10. 删除Ngnix 日志

    删除Ngnix日志的脚本 #!/bin/bash #初始化 LOGS_PATH=$(pwd)/logs YESTERDAY=$(date -d "yesterday" +%Y-%m ...