右上角的爱心是收藏按钮,白色是未收藏,红色是收藏.
需求是: 用户可以任务点击收藏和取消收藏,如果点了收藏,下次再来到这个页面要显示已收藏状态.
但是我的代码只能做到点击收藏和取消收藏,下次再来到这个页面又变成未收藏状态了(应该是重新判断了代码,所以我想应该要记录下用户的点击状态,如果用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를 Key로 직접 사용할 수 있으며 Value 값은 수집 여부를 기록하는 BOOL 값입니다. 수집 여부
으아악그런 다음 viewWillAppear에서 먼저 값을 가져옵니다
으아악이런 내용을 저장하려면 userDefault를 사용하지 않는 것이 가장 좋다고 생각합니다. userDefault는 전체 사전을 plist 파일에 저장합니다. 상품이 많아질수록 이 사전의 키 값도 늘어나게 되는데, 결국에는 한 상품의 수집 현황만 로드하면 되고, 수만 줄의 파일을 읽어야 하는데, 매우 느립니다.
저는 보통 이 문제를 이렇게 처리합니다. 사용자가 즐겨찾기 버튼을 클릭하면 다음 두 가지 작업을 수행합니다.
백엔드에 수집/취소 요청 보내기
모델 업데이트, 디스플레이 상태 즉시 업데이트
항목 2는 수동으로 수행하거나 ReactCocoa를 사용하여 수행할 수 있습니다. 그렇다면 문제는 목록 페이지의 모델이 아직 업데이트되지 않았기 때문에 목록 페이지로 돌아가서 목록 페이지에서 클릭한 후에도 여전히 업데이트되지 않은 것으로 표시된다는 것입니다. 나의 일반적인 접근 방식은 세부 정보 페이지의 모델과 목록 페이지의 모델에 동일한 개체를 사용하는 것입니다. 여러 키 코드:
목록 페이지에서 세부정보 페이지로 이동:
으아악참고로 여기에 복사된 것은 객체 유형입니다. 세부정보 페이지의 모델과 목록 페이지의 배열에 있는 모델은 동일한 객체, 동일한 메모리를 가리키는 서로 다른 포인터이므로 세부정보 페이지의 모델을 업데이트하면 목록 페이지의 모델도 동시에 업데이트될 수 있습니다. 설명에 적힌 대로
isCollection
와 같은 기본 유형만 전달하면 이 효과가 발생하지 않습니다.세부정보 페이지에서 즐겨찾기 수집/취소:
으아악목록 페이지로 돌아가면 목록 페이지의 모델도 업데이트됩니다. 목록 페이지에 하트 기호도 표시되는 경우 다음을 추가하면 됩니다.
으아악목록 페이지에서 러브 로고를 업데이트할 수 있습니다.
이 컬렉션의 경우 단순히 로컬에서 데이터를 수정하는 대신 서버 데이터를 수정해야 합니다
최근에 비슷한 일을 하고 있는데, 좋아요에 대해 데이터베이스에 기록된 데이터를 반환하기 위해 ajax 배경을 사용할 수 있나요? 이렇게 처리하면 어떨까요