首页 > 关于收藏 点赞收藏按钮应该如何判断

关于收藏 点赞收藏按钮应该如何判断

右上角的爱心是收藏按钮,白色是未收藏,红色是收藏.
需求是: 用户可以任务点击收藏和取消收藏,如果点了收藏,下次再来到这个页面要显示已收藏状态.
但是我的代码只能做到点击收藏和取消收藏,下次再来到这个页面又变成未收藏状态了(应该是重新判断了代码,所以我想应该要记录下用户的点击状态,如果用nsuserdefaults代码应该如何写?).
以下是我的代码:

-(void)rightBtnClick:(UIButton *)ban {
 isCollection = !isCollection;
    
    if (isCollection) {
        
        [self.rightBtn setImage: [UIImage imageNamed: @"collection"] forState: UIControlStateNormal];
        
    } else {
    
        [self.rightBtn setImage: [UIImage imageNamed: @"notCollection"] forState: UIControlStateNormal];

    }
}

谢谢~


我觉得这种东西最好不要用 userDefault 存。userDefault 是把整个 dictionary 存到 plist 文件里的。随着商品越来越多,这个 dictionary 的键值也会越来越多,到最后只是需要加载一个商品的收藏状态,要读一个上万行的文件,不得慢死。

这个问题我一般是这么处理的。在用户点击收藏按钮的的时候做两件事:

  1. 发收藏/取消收藏的请求给后台

  2. 更新 model,即时更新显示状态

第 2 条用手动还是用 ReactCocoa 都可以。然后我猜你的问题是,列表页里的 model 还是没更新的状态,所以返回列表页、再从列表页点进来之后,还显示的是没更新的状态。而我一般的做法是,详情页里的 model 跟列表页的 model 用的是同一个对象。几处关键的代码:

从列表页进详情页:

detailViewController.someModel = self.someModelArray[someIndex];
[UINavigationController pushViewController:detailViewController animated:...];

注意此处拷贝的是一个对象类型。详情页的 model 与列表页数组里的 model 是不同的指针指向同一个对象,同一块内存,所以在详情页里对 model 的更新能让列表页的 model 同时更新。 如果只传一个基本类型,比如像你描述里写的isCollection,就起不到这个作用了。

在详情页里收藏/取消收藏:

self.someModel.favorited = !self.someModel.favorited; // 更新 model
[self.someView configureWithData:self.someModel]; // 更新界面

[SomeModelStore requestFavoriteUnFavorite:self.someModel.favorited ofSomeModel:self.someModel]; // 发送网络请求

而这样回到列表页,列表页的 model 也更新了。如果列表页也显示爱心标志的话,可以简单加一句:

[self.tableView reloadData];

就可以更新列表页的爱心标志了。


这个收藏你应该是对服务器数据做出修改,而不是简单的本地修改数据


我最近也在做类似的,点赞可以用ajax后台返回记录到数据库的数据么?这种方式处理怎么样


这个一般是由后台返回数据告诉你这个商品到底有没被收藏的 用UserDefault的话你可以直接去吧商品id作为Key,Value值为一个BOOL值记录他有没被收藏

    [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"商品id"];
    [[NSUserDefaults standardUserDefaults] synchronize];

然后在viewWillAppear里面先去取值

[[NSUserDefaults standardUserDefaults] boolForKey:@"商品id"];
【热门文章】
【热门文章】