zoukankan      html  css  js  c++  java
  • IOS开发-项目实战-点赞功能的实现

    实现思路:

    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!=0) {
    //            取到已经点赞的那一行
                BmobObject *zanObj = array[0];
    //            用户取消点赞或者点赞
                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.

     1 #pragma mark----------------网络数据下载-----------------------
     2 -(NSArray *)allmodelNew{
     3 //    每次调用该方法初始化点赞数组,保证每条新闻的数据互不影响。
     4     zan = [NSMutableArray array];//由于数据下载是异步下载,所以点赞和其他数据各用一个可变数据存放数据
     5     NSString *className = @"CampusNews";
     6     NSMutableArray *all = [NSMutableArray array];
     7     BmobQuery *quer = [BmobQuery queryWithClassName:className];
     8     [quer orderByDescending:@"updatedAt"];
     9     quer.limit = 3;
    10     [quer findObjectsInBackgroundWithBlock:^(NSArray *array, NSError *error) {
    11         
    12         for (BmobObject *data in array) {
    13 //            用一个Newmodel模型来装载数据
    14             Newmodel *info    = [[Newmodel alloc] init];
    15             if ([data objectForKey:@"name"]) {
    16                 info.name    = [data objectForKey:@"name"];
    17             }
    18             if ([data objectForKey:@"text"]) {
    19                 info.text  = [data objectForKey:@"text"];
    20             }
    21             info.time   = [dateformatter stringFromDate:data.updatedAt];
    22             info.ID = data.objectId;
    23  #pragma mark---------------点赞计算--------------------------
    24 //            查找点赞个数
    25             BmobQuery *query = [BmobQuery queryWithClassName:@"dian_zan"];
    26 //            查找该账号的所有点赞数据(并且全部是YES的数据)
    27             [query whereKey:@"newsID" equalTo:data.objectId];
    28             [query whereKey:@"dianzan" equalTo:@(YES)];
    29             [query findObjectsInBackgroundWithBlock:^(NSArray *array, NSError *error) {
    30 //                可变数组zan
    31                 [zan addObject:@(array.count)];
    32         
    33             }];
    34             
    35             [all addObject:info];
    36         }
    37         _allmodelNews = all;
    38         if (_allmodelNews.count == _allmodelNews.count) {
    39             [Mytabview.footer endRefreshing];
    40         }
    41 
    42         [self performSelectorOnMainThread:@selector(upDateUI) withObject:nil waitUntilDone:YES];
    43            }];
    44        return _allmodelNews;
    45 }
  • 相关阅读:
    使用MVC框架中要注意的问题(八):HandleError
    HttpModule中真的不能读写Session吗?
    使用MVC框架中要注意的问题(二):将Model和Controller单独用一个项目设计
    Linq TO SQL 虽好,但不要滥用
    div如何实现左右两个panel并排,而且高度一致
    Required Content Placeholders in SharePoint Masterpages
    LINQ TO SQL:直接执行查询和命令
    使用MVC框架中要注意的问题(三):如何为链接指定路径
    SharePoint Server 2007 页面模型{转载}
    使用MVC框架中要注意的问题(四):ActionLink只是执行Get的操作
  • 原文地址:https://www.cnblogs.com/chenhongios/p/4817908.html
Copyright © 2011-2022 走看看