实现思路:

1.每一条新闻就是一个cell,在cell上添加点赞按钮。

2.让cell的控制器成为自定义cell的代理,将点击了哪一个cell放在代理方法中传出去。

3.并将这条新闻的ID和当前用户的ID上传服务器。

4.此时要考虑每个用户只能点击一次,且当用户再次点击的时候,取消点赞(定义一个BOOL变量存储用户的点击次数)。则将上传的数据取出来,做判断,如果取出来有数据,说明用户点击过,没有数据那就存储到网络。再次点击,将请求下来的数据,即BOOL变量存储为NO,即取消点赞。

5.到这里就要考虑取出所有用户点击此条新闻的数据怎样赋值给cell?也就是和取其他数据一起取出,这样保证每条新闻对应数据量一直,然后一起赋值给cell,这样就完成了这项功能。

部分重点代码实现:(bmob)

在cell的代理方法中:

-(void)TableViewForCell:(News_TableViewCell *)cell andbutton:(UIButton *)button{

//    获得点击了那一行
NSIndexPath *indexPath = [Mytabview indexPathForCell:cell];
NSString *className = @"dian_zan"; Newmodel *news = _allmodelNews[indexPath.row];
BmobObject *data = [[BmobObject alloc] initWithClassName:className];
// 获得当前用户
BmobUser *user = [BmobUser getCurrentUser]; BmobQuery *query = [BmobQuery queryWithClassName:className];
// 两个判断条件,用户的ID和此条新闻的ID作判断
[query whereKey:@"newsID" equalTo:news.ID];
[query whereKey:@"userID" equalTo:user.objectId]; [query findObjectsInBackgroundWithBlock:^(NSArray *array, NSError *error) {
NSLog(@"error == %@",error);
// 用户点击过
if (array.count!=) {
// 取到已经点赞的那一行
BmobObject *zanObj = array[];
// 用户取消点赞或者点赞
BOOL zann = [[zanObj objectForKey:@"dianzan"] boolValue]==NO?YES:NO; BmobObject *data = [BmobObject objectWithoutDatatWithClassName:className objectId:zanObj.objectId];
// 最终结果上传云端
[data setObject:@(zann) forKey:@"dianzan"];
[data updateInBackgroundWithResultBlock:^(BOOL isSuccessful, NSError *error) {
if (!error) {
}
}]; }else{
// 用户没有点击过的话,就保存用户点赞
[data setObject:user.objectId forKey:@"userID"];
[data setObject:news.ID forKey:@"newsID"];
[data setObject:@(YES) forKey:@"dianzan"];
// [data setObject:@(indexPath.row) forKey:@"row"];
[data saveInBackgroundWithResultBlock:^(BOOL isSuccessful, NSError *error) {
NSLog(@"tijiao == %@",error);
if (!error) {
}
}];
} }]; }

处理网络数据,将网络数据赋值给对应的cell.

 #pragma mark----------------网络数据下载-----------------------
-(NSArray *)allmodelNew{
// 每次调用该方法初始化点赞数组,保证每条新闻的数据互不影响。
zan = [NSMutableArray array];//由于数据下载是异步下载,所以点赞和其他数据各用一个可变数据存放数据
NSString *className = @"CampusNews";
NSMutableArray *all = [NSMutableArray array];
BmobQuery *quer = [BmobQuery queryWithClassName:className];
[quer orderByDescending:@"updatedAt"];
quer.limit = ;
[quer findObjectsInBackgroundWithBlock:^(NSArray *array, NSError *error) { for (BmobObject *data in array) {
// 用一个Newmodel模型来装载数据
Newmodel *info = [[Newmodel alloc] init];
if ([data objectForKey:@"name"]) {
info.name = [data objectForKey:@"name"];
}
if ([data objectForKey:@"text"]) {
info.text = [data objectForKey:@"text"];
}
info.time = [dateformatter stringFromDate:data.updatedAt];
info.ID = data.objectId;
#pragma mark---------------点赞计算--------------------------
// 查找点赞个数
BmobQuery *query = [BmobQuery queryWithClassName:@"dian_zan"];
// 查找该账号的所有点赞数据(并且全部是YES的数据)
[query whereKey:@"newsID" equalTo:data.objectId];
[query whereKey:@"dianzan" equalTo:@(YES)];
[query findObjectsInBackgroundWithBlock:^(NSArray *array, NSError *error) {
// 可变数组zan
[zan addObject:@(array.count)]; }]; [all addObject:info];
}
_allmodelNews = all;
if (_allmodelNews.count == _allmodelNews.count) {
[Mytabview.footer endRefreshing];
} [self performSelectorOnMainThread:@selector(upDateUI) withObject:nil waitUntilDone:YES];
}];
return _allmodelNews;
}

IOS开发-项目实战-点赞功能的实现的更多相关文章

  1. iOS开发项目实战——Swift实现图片轮播与浏览

    近期開始开发一个新的iOS应用,自己决定使用Swift.进行了几天之后,发现了一个非常严峻的问题.那就是无论是书籍,还是网络资源,关于Swift的实在是太少了,随便一搜全都是OC实现某某某功能.就算是 ...

  2. iOS开发项目实战——Swift实现ScrollView滚动栏功能

    手机作为一个小屏设备,须要显示的信息往往无法在一个屏幕上显示,此时就须要使用到滚动栏,当然除了像TableView这样能够自带滚动功能的. 假设一个界面上View较多,那就必须要使用到ScrollVi ...

  3. iOS开发——项目实战总结&经典错误一

    经典错误一 No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=armv7, VA 运行报错 出现的原因:armv7s ...

  4. iOS开发——项目实战总结&Block使用注意点浅析

    Block使用注意点浅析 1.在使用block前需要对block指针做判空处理. 不判空直接使用,一旦指针为空直接产生崩溃. if (!self.isOnlyNet) { if (succBlock ...

  5. iOS开发——项目实战总结&带你看看Objective-C的精髓

    带你看看Objective-C的精髓 1:接口与实现 @interface...@end @implementation...@end @class 接口(头文件) 实现文件 向前引用 注:类别通过增 ...

  6. iOS开发——项目实战总结&关于随机量

    关于随机量 rand 是一个标准的 C 函数. random 是定义为 POSIX 标准的一部分. arc4random 是在 BSD 和派生平台. 随机数 arc4random_uniform(N) ...

  7. iOS开发——项目实战总结&数据持久化分析

    数据持久化分析 plist文件(属性列表) preference(偏好设置) NSKeyedArchiver(归档) SQLite 3 CoreData 当存储大块数据时你会怎么做? 你有很多选择,比 ...

  8. iOS开发——项目实战OC篇&类QQ黏性按钮(封装)

    类QQ粘性按钮(封装) 那个,先来说说原理吧: 这里原理就是,在界面设置两个控件一个按钮在上面,一个View在下面(同样大小),当我们拖动按钮的时候显示下面的View,view不移动,但是会根据按钮中 ...

  9. C# Xamarin移动开发项目实战篇

    一.课程介绍 在前面阿笨的<C# Xamarin移动开发基础进修篇>课程中,大家已经熟悉和了解了Xamarin移动App开发的基础知识和原理.本次分享课<C# Xamarin移动开发 ...

随机推荐

  1. Sprint2-3.0

    后续安排 第16周 周二晚7点之前将本代码上传到GITHUB. GITHUB地址:https://github.com/QueenIcey/teamwork/tree/master/eslife1 周 ...

  2. 运用js解决java selenium元素定位问题

    一.解决定位并操作uneditable元素 尝试了通过id,xpath等等定位元素后点击都提示Element is not clickable at point 再看了下可以click的元素发现上面有 ...

  3. python语言技巧

    一 在写之前 最好指定python的路径: #!/usr/bin/python python 在linux中需要添加编码方式:以免出现中文乱码 # -*- coding: UTF-8 –*-   二 ...

  4. [转]jQuery.validate插件在失去焦点时执行验证代码

    转:http://my.oschina.net/enyo/blog/311566 关于 jquery.validate.js 表单验证插件如何在失去焦点时做验证.看手册后发现默认是在表单提交时执行验证 ...

  5. WampServer Version 2.5 bug修改

    做PHP开发都需要安装PHP的运行环境,为了方便,网上可以下载到好多的集成环境,最近使用WampServer Version 2.5发现有一些bug,分享一下修改的方法.高手请路过. 1.echo d ...

  6. Google 黑客搜索技巧

    常用的google关键字: foo1 foo2 (也就是关联,比如搜索xx公司 xx美女) operatorfoo filetype123 类型 sitefoo.com 相对直接看网站更有意思,可以得 ...

  7. 最短路径——Floyd算法

    如何求一张图中任意两顶点之间的最短路径长度,这里写一种最简单的算法——Floyd算法: #include<stdio.h> #define inf 9999 int main() { ][ ...

  8. 在Linux中使用vi打开文件时如何显示行号,及跳转到指定行

    vi 文件名,打开文件后 如果要显示所有行号,使用 :set nu 如果要显示当前行号,使用 :nu 如果要跳转到指定行,使用 :行号 例如,跳转到第10行,使用 :10

  9. java_easyui体系之目录 [转]

    摘要:简单介绍form的提交方式.与validatebox的结合使用. 一:form简介 Easyui中的form有两种提交方式.结合自己新添加的一种ajax提交方式.本文简单说明form的三种提交方 ...

  10. ubuntu arm妙算加载cp210x驱动

    在妙算TK1上安装ros后,插上usb串口竟然没有驱动 无奈装 从http://www.silabs.com/products/mcu/pages/usbtouartbridgevcpdrivers. ...