在单元格内维护按钮选择状态

时间:2017-05-23 18:49:05

标签: swift uitableview uicollectionview uicollectionviewcell tableviewcell

假设我在集合视图中有3个单元格。单元格内部是一个关注按钮,其中isSelected = true州的标题为followingisSelected = 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
}

}

2 个答案:

答案 0 :(得分:0)

要有效地实现此目的,您需要保存以下列表的用户数据。然后将这些与在tableview中汇总数据时从api获得的数据进行比较。或者您必须实时更新服务器上的数据,并仅使用服务器数据更新表。

答案 1 :(得分:0)

不一定需要服务器端。你可以维护一个Bool数组。数组长度=项目数。选择具有相反值的按钮更新数组时。

例如:最初您的数组看起来像[false,false,false]

在第一个单元格中选择按钮。使用[false,true,false]更新数组并同时检查cellForItemAt,如果数组索引处的值为true,则显示以下其他显示跟随。