假设我在集合视图中有3个单元格。单元格内部是一个关注按钮,其中isSelected = true
州的标题为following
,isSelected = false
州的文字为follow
。
第一个和第三个按钮的isSelected
状态为false
,第二个按钮的状态为isSelected
true
。这使得它是假的,真实的,错误的。
问题是,我想在重新加载集合视图时维护这些状态。每当我在我的collectionView中调用pull刷新时,它将读取json并将数据加载到collectionView中。由于细胞如何重复使用,它最终会重新加载前一个细胞。
最初,isSelected
状态的顺序为false,true,false。然后由于如何重用单元格,这将变为false,false为真。
然后,一旦我再次请求检查按钮的状态应该是什么,它就会变回false,true,false。但是,我想保持状态,而不是必须检查状态。否则,它看起来很麻烦。一瞬间,按钮的isSelected
状态不正确。
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: UserCell.reuseIdentifier, for: indexPath) as! UserCell
cell.user = user?[indexPath.row]
// cell.followButton.isSelected = false
return cell
}
class UserCell: UICollectionViewCell {
var user: User? {
didSet {
followButton.user = user
}
lazy var followButton: FollowButton = {
let button = FollowButton()
return button
}()
}
class FollowButton: UIButton {
var user: User? {
didSet {
checkIfUserIsFollowed()
}
}
override var isSelected: Bool {
didSet {
self.layer.backgroundColor = isSelected ? UIColor.rgb(50, green: 205, blue: 50).cgColor
: UIColor.white.cgColor
}
}
override init(frame: CGRect) {
super.init(frame: frame)
layer.cornerRadius = 4
layer.backgroundColor = UIColor.white.cgColor
translatesAutoresizingMaskIntoConstraints = false
setTitle("Follow", for: .normal)
setTitle("Following", for: .selected)
contentEdgeInsets = UIEdgeInsetsMake(5,5,5,5)
titleLabel?.font = UIFont(name: "HelveticaNeue", size: 13.0)
contentHorizontalAlignment = .right
setTitleColor(UIColor.rgb(50, green: 205, blue: 50), for: .normal)
setTitleColor(UIColor.white, for: .selected)
layer.borderWidth = 0.5
layer.borderColor = UIColor.rgb(50, green: 205, blue: 50).cgColor
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func checkIfUserIsFollowed() {
// This is a request that checks where the logged in user is following the user inside the cell. It either returns true or false and sets the state accordingly
}
}
答案 0 :(得分:0)
要有效地实现此目的,您需要保存以下列表的用户数据。然后将这些与在tableview中汇总数据时从api获得的数据进行比较。或者您必须实时更新服务器上的数据,并仅使用服务器数据更新表。
答案 1 :(得分:0)
不一定需要服务器端。你可以维护一个Bool数组。数组长度=项目数。选择具有相反值的按钮更新数组时。
例如:最初您的数组看起来像[false,false,false]
在第一个单元格中选择按钮。使用[false,true,false]更新数组并同时检查cellForItemAt,如果数组索引处的值为true,则显示以下其他显示跟随。