右上角的爱心是收藏按钮,白色是未收藏,红色是收藏.
需求是: 用户可以任务点击收藏和取消收藏,如果点了收藏,下次再来到这个页面要显示已收藏状态.
但是我的代码只能做到点击收藏和取消收藏,下次再来到这个页面又变成未收藏状态了(应该是重新判断了代码,所以我想应该要记录下用户的点击状态,如果用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];
}
}
谢谢~
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
Ensuite, récupérez d'abord la valeur dans viewWillAppear
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 :
Envoyer/annuler la demande de collecte au backend
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 :
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 :
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 :
Vous pouvez mettre à jour le logo d'amour sur la page de liste.
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