iOS UICollectionViewCell上有Button点击实现收藏效果

来源:互联网 发布:使用c语言编写小游戏 编辑:程序博客网 时间:2024/05/16 14:30

一、发现问题

前几天做项目的时候遇到了一个问题困扰我好久,问题是这样的:下图中cell上有一个button(空的星星),我想实现的效果是点击把空心的星星变成实心的星星,再点就换回来,就是视觉上的收藏、取消收藏效果。而获取的数据没有标志这一项的,需要自己做。刚开始感觉很简单无非就是点击换个图片,用个BOOL值来判断就可以了,但是后来发现完全不是这么回事,由于button是在cell上,而cell是相同的而且是重用的,这样就有好多问题:

(1)在点击任意一个button的时候都会走同一个点击方法,造成点击换图时发生错乱;

(2)点击某一个button变成黑色实心星星,往上滑的时候发现下别有的button的图片也换了(由cell的重用机制造成);

(3)下拉刷新的时候以前button换实心图片的也就又换回空心的了。



二、解决问题

后来经过思考,认识到cell只是展示数据的载体,数据是不断的变化的,也许现在是1号数据在1号cell上,在刷新的时候如果有数据的更新,那么新的数据就会把1号cell占据,原来的数据就会被挤到后边,所以正确的思路不是在cell上进行操作,而是要把判断是否是实心button的bool值与数据相关联,下面就一步一步来做:
(1)首先在AppDelegate.m  里定义一个数组(titleArray)并用NSUserDefaults保存;
(2)在model类里加一个bool值(isCollection)作为button显示哪张照片的依据;
(3)给button赋上tag值(便于取出model),并在button点击的方法中判断isCollection的值,如果没有收藏就点击的时候换照片,同时把model的标题(title)放到数组中,用NSUserDefaults保存;
(4)在model给cell赋值的方法里判断model的tiltle是否在NSUserDefaults保存的数组中,如果在的话就把bool值isCollection变成YES;
(5)把数据保存起来在我的收藏里显示(这里的代码就不展示了)。

三、我都代码

AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    //记住登录状态    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];    [userDefaults setObject:@"denglu" forKey:@"isLogin"];    [userDefaults synchronize];         NSMutableArray *array = [NSMutableArray arrayWithCapacity:0];    [[NSUserDefaults standardUserDefaults]setObject:array forKey:@"titleArray"];    [[NSUserDefaults standardUserDefaults] synchronize];

CollectionView.m
#pragma mark -- button 点击方法-(void)collectionBtnDidClicked:(UIButton *)sender{         UIButton *button = [sender.superview viewWithTag:sender.tag];        NSString *str =[[NSUserDefaults standardUserDefaults]objectForKey:@"isLogin"];    if ([str isEqualToString:@"denglu"]) {        //如果没有登录弹框        [self havenotLogin];            }else{        //已经登录        /**         *  首先判断有没有收藏过,如果没有点击之后会收藏从感官上来说是小五角星变成实心的其实就是换了一个图片,再点一次取消收藏,再把图片换回来,         */        SelectModel *model = self.array[sender.tag - 100] ;                    if (model.isCollection == NO ) {                                NSLog(@"%ld",button.tag - 100);                //判断如果还没有收藏                [button setImage:[UIImage imageNamed:@"sShou.png"] forState:UIControlStateNormal];                             model.isCollection = YES;                NSMutableArray *titleArray = [[NSUserDefaults standardUserDefaults]objectForKey:@"titleArray"];                //这是不能直接用titleArray需要用另外一个Array替换                NSMutableArray *titleArray1 = [NSMutableArray arrayWithArray:titleArray];               [titleArray1 addObject:model.title];                [[NSUserDefaults standardUserDefaults] setObject:titleArray1 forKey:@"titleArray"];                [[NSUserDefaults standardUserDefaults] synchronize];                            }else{                //换图片                [button setImage:[UIImage imageNamed:@"kShou.png"] forState:UIControlStateNormal];                model.isCollection = NO;                                  }        NSLog(@"=================%d==%@",model.isCollection,model.title              );                                   }        }

cell.m给cell赋值的方法
//赋值方法-(void)setCellWithSelectModel:(SelectModel *)model{    self.picImageView.image  = [UIImage imageNamed:@"zhanwei.jpg"];    [self.picImageView sd_setImageWithURL:[NSURL URLWithString:model.firstImg]];        self.titleLabel.text = model.title;    self.scoreLabel.text = model.source;    NSMutableArray *array = [[NSUserDefaults standardUserDefaults]objectForKey:@"titleArray"];    //判断title是否在数组中,    for (int i = 0; i < array.count; i ++) {        if ([model.title isEqualToString:array[i]]) {            model.isCollection = YES;        }    }    if (model.isCollection == NO) {        [self.collectionBtn setImage:[UIImage imageNamed:@"kShou.png"] forState:UIControlStateNormal];    }else{        [self.collectionBtn setImage:[UIImage imageNamed:@"sShou.png"] forState:UIControlStateNormal];    }        }

至此,问题就告一段落了。附图一张:


1 0