iOS开发——开发必备OC篇&彩票实战之精华讲解
彩票实战之精华讲解
在这段时间自己研究并学习关于彩票项目开发的时候遇到各种坑,各种技术点以前或许之前用过但是却用起来不是那么熟悉,所以没遇到一个重点的地方我就会记录一下,希望不会再有下次。
本文主要讲解笔者在彩票实战中遇到的一些重要的技术点和思路。
下面就来总结一下
一:设置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;
- typeof(self) 返回一个对象类型
- typeof(self) == XMGPrizeAnimationViewController
- __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篇&彩票实战之精华讲解的更多相关文章
- ios开发——实用技术篇OC篇&iOS的主要框架
iOS的主要框架 阅读目录 Foundation框架为所有的应用程序提供基本系统服务 UIKit框架提供创建基于触摸用户界面的类 Core Data框架管着理应用程序数据模型 Core ...
- iOS开发——开发必备OC篇&UITableView设置界面完整封装(四)
设置界面完整封装(四) 简单MVC实现UITableView设置界面完善封装及拓展使用 关于使用和拓展, 其实基本上就是同UItableView,知识讲数据改一下就可以 拓展使用 1:首先定义一个数组 ...
- iOS开发——开发必备OC篇&UITableView设置界面完整封装(三)
UITableView设置界面完整封装(三) 简单MVC实现UITableView设置界面之界面跳转 创建一个需要调整的对应的控制器 在需要调整的类型模型中创建对应的属性用来实现调整类型控制器的设置 ...
- iOS开发——开发必备OC篇&UITableView设置界面完整封装(二)
UITableView设置界面完整封装(二) 简单MVC实现UITableView设置界面之Cell右边类型设置 首先来看看第一种方法证明使用,结合两种方法之后根据个人的爱好去选择就可以了, 一:使用 ...
- iOS开发——开发必备OC篇&UITableView设置界面完整封装(一)
UITableView设置界面完整封装(一) 简单MVC实现UITableView设置界面分组数据显示 一:模型 1:cell模型 /** 描述cell图片 */ @property (nonatom ...
- iOS开发——网络实用技术OC篇&网络爬虫-使用青花瓷抓取网络数据
网络爬虫-使用青花瓷抓取网络数据 由于最近在研究网络爬虫相关技术,刚好看到一篇的的搬了过来! 望谅解..... 写本文的契机主要是前段时间有次用青花瓷抓包有一步忘了,在网上查了半天也没找到写的完整的教 ...
- iOS开发——高级技术OC篇&运行时(Runtime)机制
运行时(Runtime)机制 本文将会以笔者个人的小小研究为例总结一下关于iOS开发中运行时的使用和常用方法的介绍,关于跟多运行时相关技术请查看笔者之前写的运行时高级用法及相关语法或者查看响应官方文档 ...
- iOS开发——网络实用技术OC篇&网络爬虫-使用java语言抓取网络数据
网络爬虫-使用java语言抓取网络数据 前提:熟悉java语法(能看懂就行) 准备阶段:从网页中获取html代码 实战阶段:将对应的html代码使用java语言解析出来,最后保存到plist文件 上一 ...
- iOS开发——UI精选OC篇&UIApplication,UIWindow,UIViewController,UIView(layer)简单介绍
UIApplication,UIWindow,UIViewController,UIView(layer)简单介绍 一:UIApplication:单例(关于单例后面的文章中会详细介绍,你现在只要知道 ...
随机推荐
- 该不该将变量设为 null ?
该不该将变量设为 null ? 对于引用类型的变量,在什么时候需要将其显式设为 null ,在什么时候不需要呢? 局部变量 对于局部变量,在方法结束的时候,变量就会失效,变量指向的对象引用也会减少一个 ...
- 解决g++:command not found(centos7.0)
问题背景,因为装了虚拟机,系统为centos7.0,由于是纯净版,没有gcc,使用命令yum install gcc安装了gcc,但是没安装g++,导致g++:command not found问题. ...
- 刚刚大学毕业,自己搭网站遇到的问题 一:tomcat中同时部署两个项目的问题
最近直接把两个项目打成war包在tomcat下发布,出现了很多莫名奇妙的问题,就是不能发布成功,只能有一个项目能成功,在网上查了很多方法,以为是两个项目中jar包出现冲突,也按照网上的方法把两个项目中 ...
- 【VC】VC工具栏图标合并工具(非tbcreator和visual toolbar)
VC开发难免会用到toolbar,在没有美工的时候,大部分时间我们只能自己上. 第一个方法:fireworks/photoshop平铺.现在的图片资源大多为背景透明的png图片,虽然fireworks ...
- 消息队列与RabbitMQ
1 什么是消息队列 消息指进程或应用间通信的数据:队列是保存数据的结构:消息队列是指进程或应用间通信时,保存消息的容器.消息队列独特的机制和结构保证了消息发送者和接收者之间良好的异步通信. 2 为什么 ...
- geeksforgeeks@ Find sum of different corresponding bits for all pairs (Bit manipulation)
http://www.practice.geeksforgeeks.org/problem-page.php?pid=387 Find sum of different corresponding b ...
- Codeforces Educational Codeforces Round 15 D. Road to Post Office
D. Road to Post Office time limit per test 1 second memory limit per test 256 megabytes input standa ...
- C++builder XE10 终于支持类内变量初始化了
Win32终于支持类内变量初始化了,C++11 用bcc32C编译器 llvm CLang.还支持Unicode 中文汉字 变量名. 用经典的bcc32编译还是不支持! class TPerson ...
- C#实现office文档转换为PDF或xps的一些方法( 转)
源博客http://blog.csdn.net/kable999/article/details/4786654 代码支持任意office格式 需要安装office 2007 还有一个office20 ...
- BootCamp支持软件4/5
按 Mac 机型列出的 Boot Camp 要求 不同的 Mac 电脑适用不同版本的 Windows.如果您不知道您拥有的 Mac 是什么机型,请从 Apple 菜单中选取“关于本机”. 每个表格条目 ...