右上角的爱心是收藏按钮,白色是未收藏,红色是收藏.
需求是: 用户可以任务点击收藏和取消收藏,如果点了收藏,下次再来到这个页面要显示已收藏状态.
但是我的代码只能做到点击收藏和取消收藏,下次再来到这个页面又变成未收藏状态了(应该是重新判断了代码,所以我想应该要记录下用户的点击状态,如果用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 を使用する場合は、製品 ID をキーとして直接使用でき、Value 値は BOOL 値で収集されたかどうかを記録します。収集されているかどうか
リーリー次に、最初に viewWillAppear で値を取得します
リーリーこの種の保存には userDefault を使用しないほうが良いと思います。 userDefault は辞書全体を plist ファイルに保存します。製品が増えるにつれて、この辞書のキー値も増加します。最終的には、1 つの製品の収集ステータスを読み込むだけで済み、数万行のファイルを読み込む必要があります。これは非常に遅いです。
これが私が通常この問題に対処する方法です。ユーザーがお気に入りボタンをクリックすると、次の 2 つのことを行います:
バックエンドに収集/キャンセルリクエストを送信します
モデルを更新し、表示ステータスを即時に更新します
項目 2 は手動または ReactCocoa を使用して実行できます。次に、リストページのモデルがまだ更新されていないことが問題だと思います。そのため、リストページに戻ってリストページをクリックしても、まだ更新されていないことが表示されます。私の一般的なアプローチは、詳細ページのモデルとリスト ページのモデルに同じオブジェクトを使用することです。いくつかのキーコード:
一覧ページから詳細ページへ移動します:
リーリーここでコピーされるのはオブジェクト タイプであることに注意してください。詳細ページのモデルとリスト ページの配列内のモデルは、同じオブジェクトと同じメモリを指す異なるポインタを持っているため、詳細ページのモデルを更新すると、リスト ページのモデルも同時に更新できます。 説明に記載されている
isCollection
などの基本型のみを渡す場合、この効果はありません。詳細ページでお気に入りを収集/キャンセルします:
リーリー一覧ページに戻ると、一覧ページのモデルも更新されます。リスト ページにハートマークも表示される場合は、次のように追加するだけです:
リーリーリストページでラブロゴを更新できます。
このコレクションの場合、データをローカルで変更するだけではなく、サーバー データを変更する必要があります
私は最近同様のことを行っています。ajax バックグラウンドを使用して、データベースに記録されたデータを「いいね」として返すことはできますか?このように処理してみてはいかがでしょうか