iOS开发——实战技术OC篇&产品推荐界面的实现

产品推荐界面的实现

目前很多公司都仅仅只有一个项目,所以他们关于其他的项目肯定会做相应的推广,而在APp内部使用产品推荐实现APP的推广使一种很常见的现象,因为不需要什么成本,所以今天就简单介绍一下这么去搭建一个简单的产品推荐界面。

本章重点:

  • 1:使用JSON数据:将JSON数据序列化,然后显示到界面上
  • 2:根据设备是否安装对应的应用显示不同的信息,比如图片
  • 3:根据设备是否安装对应的应用点击对应的按钮实现不同的功能

好了下面就来看看关于产品推荐界面是怎么去实现的!

1:JSON数据

2:对应的模型属性和模型方法(这里就不多介绍了)

 1 @property (nonatomic, copy) NSString *title;
 2
 3 @property (nonatomic, copy) NSString *stitle;
 4
 5 @property (nonatomic, copy) NSString *ID;
 6
 7 @property (nonatomic, copy) NSString *url;
 8
 9 @property (nonatomic, copy) NSString *icon;
10
11 @property (nonatomic, copy) NSString *customUrl;
12
13
14
15 -(instancetype)initWithDict:(NSDictionary *)dict;
16
17 +(instancetype)productWithDict:(NSDictionary *)dict;

模型方法的实现

 1 -(instancetype)initWithDict:(NSDictionary *)dict
 2
 3 {
 4
 5     if (self == [super init]) {
 6
 7         self.title = dict[@"title"];
 8
 9         self.stitle = dict[@"stitle"];
10
11         self.ID = dict[@"id"];
12
13         self.url = dict[@"url"];
14
15         self.icon = dict[@"icon"];
16
17         self.customUrl = dict[@"customUrl"];
18
19     }
20
21     return self;
22
23 }
24
25
26
27 +(instancetype)productWithDict:(NSDictionary *)dict
28
29 {
30
31     return [[self alloc] initWithDict:dict];
32
33 }

3:自定义Cell

 1 +(instancetype)cellWithTableView:(UITableView *)tableView
 2
 3 {
 4
 5     static NSString *ID = @"Cell";
 6
 7     iCocosProductsCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
 8
 9     if (cell == nil) {
10
11         cell = [[iCocosProductsCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
12
13     }
14
15     return cell;
16
17 }

4:控制器中实现最基本的方法:

 1 - (void)viewDidLoad {
 2
 3     [super viewDidLoad];
 4
 5
 6
 7     self.title = @"产品推荐";
 8
 9
10
11 }
12
13
14
15 #pragma mark - Table view data source
16
17 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
18
19
20
21     return self.products.count;
22
23 }
24
25
26
27 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
28
29     iCocosProductsCell *cell = [iCocosProductsCell cellWithTableView:tableView];
30
31
32
33     iCocosProductsModel *products = self.products[indexPath.row];
34
35
36
37     cell.products = products;
38
39
40
41     return cell;
42
43 }

5:这里就是控制器中的重点,也就是JSON数据的加载和序列化,关于JSON数据的序列化详细请查看笔者之前写的:

我们使用一个可变数组,实现将JSON数据序列化出来的数组存放在里面方便后面的tableView代理方法直接使用,这里前面的MVC已经非常清楚了,

定义可变数组

 1 -(NSMutableArray *)products
 2
 3 {
 4
 5
 6
 7 实现懒加载可变数组
 8
 9     if (_products == nil) {
10
11         _products = [NSMutableArray array];
12
13
14
15
16
17 //       NSString *urlPath = [[NSBundle mainBundle] pathForResource:@"more_project.json" ofType:nil];
18
19 //
20
21 //        NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlPath]];
22
23
24
25         NSURL *jsonPath = [[NSBundle mainBundle] URLForResource:@"more_project.json" withExtension:nil];
26
27         NSData *data = [NSData dataWithContentsOfURL:jsonPath];
28
29
30
31         id arrdata = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
32
33
34
35         if ([arrdata isKindOfClass:[NSArray class]]) {
36
37             for (NSDictionary *dict in arrdata) {
38
39                 iCocosProductsModel *products = [iCocosProductsModel productWithDict:dict];
40
41
42
43                 [_products addObject:products];
44
45             }
46
47         }
48
49
50
51
52
53         NSLog(@"%@", _products);
54
55     }
56
57     return _products;
58
59 }

6:要现实数组,我就需要在自定义Cell中实现相应的数据显示方法

定义一个模型属性:

重写他的setter方法,设置对应的数据:

 1 -(void)setProducts:(iCocosProductsModel *)products
 2
 3 {
 4
 5     _products = products;
 6
 7
 8
 9     self.imageView.image = [UIImage imageNamed:products.icon];
10
11
12
13     self.textLabel.text = products.title;
14
15
16
17     self.detailTextLabel.text = products.stitle;
18
19 }

此时就可以简单的现实数据了:

关于图片为什么不显示,这里是一个需要注意的地方,平时开发中我们要根据需求来开发,比如在我们的json数据中图片都是有@2x.png的,但是Xcode有会默认帮我们在后面加上@2x.png,所以有的时候就可能导致图片不显示,这个时候我们就需要使用字符串的替换方法将@2x.png替换成空的字符串,当然你也可以使用其他的方法

1     NSString *imgName = [products.icon stringByReplacingOccurrencesOfString:@"@2x.png" withString:@""];
2
3     self.imageView.image = [UIImage imageNamed:imgName];

7:然就要实现Cell中下载按钮的现实和业务逻辑的实现,这里说一下思路

  • 1:由于根据设备中是否安装有对应的软件,所以需要判断并且设置对应的按钮图片,
  • 2:由于根据设备中是否安装有对应的软件,所以需要判断并且根据判断结果点击按钮之后实现相应的功能(有就打开应用,没有酒调到App Store下载应用)

所以这里我们在模型中新增一个两个属性

1:判断是否安装对应软件:

    • @property (nonatomic, assign, getter=isInstall) BOOL install;

2:打开对应的URL

    • @property (nonatomic, copy) NSString *openURL;

实现判断是否安装对应App的getter方法,传入模型中对应的值。

这里设置到了应用调整的知识,其实就相当去设备中的路径:scheme + :// + indentifer

使用上面传如的值结合单例UIApplication的canOpenURL方法判断是否可以打开(即是都安装对应的软件)

 1 -(BOOL)isInstall
 2
 3 {
 4
 5 #warning 跳转应用 scheme + :// + indentifer
 6
 7     NSString *openUrl = [NSString stringWithFormat:@"%@://%@",self.customUrl, self.ID];
 8
 9
10
11     self.openURL = openUrl;
12
13
14
15     // 应用已经安装
16
17     return  [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:openUrl]];
18
19 }

8:然后在Cell实现下载或者打开按钮的现实和业务逻辑的实现:

首先在私有拓展中声明一个按钮的属性

  • @property (nonatomic, strong) UIButton *rightBtn;

然后懒加载按钮并且为按钮添加点击事件:

 1 -(UIButton *)rightBtn
 2
 3 {
 4
 5     if (_rightBtn == nil) {
 6
 7         _rightBtn = [UIButton buttonWithType:UIButtonTypeCustom];
 8
 9
10
11         [_rightBtn addTarget:self action:@selector(btnClick) forControlEvents:UIControlEventTouchUpInside];
12
13     }
14
15     return _rightBtn;
16
17 }

下面就要实现第七点说道的两个重要的地方了,

1)设置按钮的图片

根据是否按钮对应的软件,在模型属性的setter方法中判断模型中的isInstall是否有值,如果有值就设置对应已经安装的图片(可直接打开),如果没有值酒设置下载按钮的图片,并且设置按钮自动适配大小

 1     if (!products.isInstall) {
 2
 3         [self.rightBtn setImage:[UIImage imageNamed:@"appadcell_downloadbutton"] forState:UIControlStateNormal];
 4
 5     } else {
 6
 7         [self.rightBtn setImage:[UIImage imageNamed:@"appadcell_openbutton"] forState:UIControlStateNormal];
 8
 9     }
10
11
12
13     [self.rightBtn sizeToFit];

最后就是实现按钮的点击了,点击按钮做对应的额事情,可能是直接打开应用,也可能使转到App Store中对应的链接地址下载对应的应用(设置设计到了部分的真机知识,但是不足以去完全讲解一些真机相关的,关于真机后面的文章中会详细介绍)。

在监听按钮点击的方法中,判断对应的isInstall是否有值有酒打开应用,没有就转到App Store下载

 1 -(void)btnClick
 2
 3 {
 4
 5     if (self.products.isInstall) {
 6
 7         [[UIApplication sharedApplication] openURL:[NSURL URLWithString:self.products.openURL]];
 8
 9     } else {
10
11         [[UIApplication sharedApplication] openURL:[NSURL URLWithString:self.products.url]];
12
13     }
14
15 }

最后我们会看到这样的界面

时间: 2024-10-11 22:36:38

iOS开发——实战技术OC篇&产品推荐界面的实现的相关文章

iOS开发——实战技术OC篇&应用帮助界面简单实现

应用帮助界面简单实现 有的时候我们可能遇到一些关于应用中的技术或者信息不够明确,所以在使用应用的时候可能会遇到一些不知道所措的情况,比如关于一些难一点的游戏应用的操作,关于应用中一些比较隐藏的功能疑惑是操作完成后需要用户去根据需求做其他相应操作的的功能,所以这里我们就实现一个简单的帮组界面,也许跟实际开发中有一些区别,但是思路理解基本上就没有什么问题了. 我们知道平时帮助界面来说,可能是使用一个掩饰案例,可能是网络连接,也能是说明文档,这里我们就简单一点使用网页结合JSON数据来实现,网页实现也

iOS开发——实战技术OC篇&关于蒙板和弹出菜单

关于蒙板和弹出菜单 一:关于蒙板 蒙板的作用一般就是用来实现不能做其他操作还有一些模糊效果提示用户 我们只需要自定义一个View,并且创建两个类方法用来给外界调用实现显示和隐藏 + (void)show; + (void)hide; 显示:直接添加到window上,并且设置和window同样大小,然后设置相应的透明度(alpla) 1 + (void)show 2 3 { 4 5 6 7 8 9 iCocosCover *cover = [[self alloc] init]; 10 11 12

iOS开发——实战技术OC篇&点击状态栏ScrollView(包括子控件)自动滚到顶部

点击状态栏ScrollView(包括子控件)自动滚到顶部 其实这种方式我们平时见的还是比较多的,而且适合用户的需求,所以就搬来琢磨了一下,感觉效果还不错 这里就直接将解决思路一一写出来不将代码分段展示了,在代码中我加了详细的注释objective-c的套路和swift基本一样,在最后会将Swift和objective-c的代码一起放上,如果需要直接解决问题的童鞋可以直接将代码拷贝到工程里即可 首先创建一个topWindow继承至NSObject,这里我们考虑将这个功能完全封装起来,所以所有的方法

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

运行时(Runtime)机制 本文将会以笔者个人的小小研究为例总结一下关于iOS开发中运行时的使用和常用方法的介绍,关于跟多运行时相关技术请查看笔者之前写的运行时高级用法及相关语法或者查看响应官方文档. 下面就来看看什么是运行时,我们要怎么在iOS开发中去使用它. 官方介绍: 这里我们主要关注的是最后一种! 下面来看看Runtime的相关总结 #pragma mark 获取属性成员 /********************************************************

iOS开发——使用技术OC篇&项目实战总结之开发技巧

项目实战总结之开发技巧 本文收集了25个关于可以提升程序性能的提示和技巧 1.使用ARC进行内存管理 2.在适当的情况下使用reuseIdentifier 3.尽可能将View设置为不透明(Opaque) 4.避免臃肿的XIBs 5.不要阻塞主线程 6.让图片的大小跟UIImageView一样 7.选择正确的集合 8.使用GZIP压缩 9.重用和延迟加载View 10.缓存.缓存.缓存 11.考虑绘制 12.处理内存警告 13.重用花销很大的对象 14.使用Sprite Sheets 15.避免

iOS开发——使用技术OC篇&保存(获取)图片到(自定义)相册

保存(获取)图片到(自定义)相册 最近在学 iOS相关技术(绘图篇实现画板功能)的时候设计到了两个常用的知识点,那就是保存图片到相册和葱相册中获取图片. 只是个人比较好奇拓展一些技术,说的难听点叫做装牛角尖,好听点就是为了装逼而已,所以在保存相册的时候使用真及测试发现不能保存到我iPhone里 main的自定义相册里面,就查看文档和资料,也借鉴别人的分享实现了想要的功能,就把他给记录下来,这个虽然没有直接保存和获取常用但是也是一项很好的实用技术. 一:首先来看看怎么获取相册的图片: 1 // 弹

iOS开发——实战总结OC篇&alloc和new使用总结

alloc和new使用总结 1.在实际开发中很少会用到new,一般创建对象咱们看到的全是[[className alloc] init] 但是并不意味着你不会接触到new,在一些代码中还是会看到[className new], 还有去面试的时候,也很可能被问到这个问题. 2.那么,他们两者之间到底有什么区别呢, 我们看源码: ------------------------------------------------------- 1 + new 2 { 3 id newObject = (

iOS开发——实战总结OC篇&网易彩票开发知识点总结

网易彩票开发知识点总结 关于网易彩票开发中遇到了不少的坑,弄了好久才弄懂,或者有些犹豫很久没用就不记得了,所以这里就总结了一下,希望以后不会忘记,就算忘记也能快速查看! /***************************************&.设置状态栏样式(白色) 两种方法******************************************/ 1 -(UIStatusBarStyle)preferredStatusBarStyle 2 3 { 4 5 if ([sel

iOS开发——使用技术OC篇&简单九宫格锁屏功能的实现与封装

简单九宫格锁屏功能的实现与封装 首先来看看最后的实现界面. 在这开始看下面的内容之前希望你能先大概思考活着回顾一下如果 你会怎么做,只要知道大概的思路就可以. 由于iphone5指纹解锁的实现是的这个功能呗淘汰,但是你可能会在想,都淘汰了你还在这里说个毛线啊,其实大家都知道,编程注重的思想,当然会了这个你不可能就会了指纹技术,哪还得等笔者在后面的学习中给大家分享,只是或许有一天这种功能或者思路在哪里要用到你不觉得是一件很开心的事情吗,而且如果你是不想自己敲的话直接可以拿来用. 好了不多废话直接上