ios - 关于收藏 点赞收藏按钮应该如何判断
PHP中文网
PHP中文网 2017-04-18 09:13:51
0
4
506

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

    }
}

谢谢~

PHP中文网
PHP中文网

认证高级PHP讲师

répondre à tous(4)
洪涛

Cela renvoie généralement des données de l'arrière-plan pour vous indiquer si le produit a été collecté ou non. Si vous utilisez UserDefault, vous pouvez directement utiliser l'identifiant du produit comme clé, et la valeur Value est une valeur BOOL pour enregistrer s'il s'agit d'une valeur BOOL. a été collecté ou non

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

Ensuite, récupérez d'abord la valeur dans viewWillAppear

[[NSUserDefaults standardUserDefaults] boolForKey:@"商品id"];
刘奇

Je pense qu'il est préférable de ne pas utiliser userDefault pour enregistrer ce genre de chose. userDefault enregistre l'intégralité du dictionnaire dans le fichier plist. Au fur et à mesure qu'il y a de plus en plus de produits, les valeurs clés de ce dictionnaire augmenteront également. Au final, il suffit de charger l'état de collecte d'un seul produit, et nous devons lire un fichier de dizaines de milliers de lignes, ce qui est très lent.

C'est ainsi que je gère habituellement ce problème. Faites deux choses lorsque l'utilisateur clique sur le bouton Favoris :

  1. Envoyer/annuler la demande de collecte au backend

  2. Mettre à jour le modèle, mettre à jour l'état d'affichage immédiatement

Le point 2 peut être réalisé manuellement ou avec ReactCocoa. Ensuite, je suppose que votre problème est que le modèle dans la page de liste n'est toujours pas mis à jour, donc après être revenu à la page de liste et avoir cliqué depuis la page de liste, il indique toujours qu'il n'est pas mis à jour. Mon approche générale consiste à utiliser le même objet pour le modèle dans la page de détails et le modèle sur la page de liste. Plusieurs codes clés :

Accédez à la page de détails depuis la page de liste :

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

Notez que ce qui est copié ici est un type d'objet. Le modèle sur la page de détails et le modèle dans le tableau sur la page de liste sont des pointeurs différents pointant vers le même objet et la même mémoire, donc la mise à jour du modèle sur la page de détails peut mettre à jour le modèle sur la page de liste en même temps. Si vous ne transmettez qu'un type de base, tel que isCollection comme écrit dans votre description, cela n'aura pas cet effet.

Collecter/annuler les favoris dans la page de détails :

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

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

Lorsque vous revenez à la page de liste, le modèle de la page de liste est également mis à jour. Si la page de liste affiche également un symbole de cœur, vous pouvez simplement ajouter :

[self.tableView reloadData];

Vous pouvez mettre à jour le logo d'amour sur la page de liste.

PHPzhong

Pour cette collection, vous devez modifier les données du serveur au lieu de simplement modifier les données localement

巴扎黑

J'ai fait quelque chose de similaire récemment. Puis-je utiliser l'arrière-plan ajax pour renvoyer les données enregistrées dans la base de données pour les likes ? Que diriez-vous de le gérer de cette façon

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal