取消选择集合视图中的项目并从数组中删除该项目不起作用

时间:2017-12-07 00:44:58

标签: arrays swift uicollectionview

我正在尝试选择一个单元格并将该单元格的内容添加到数组中,然后能够取消选择单元格并从数组中删除该相同的对象。我已经挣扎了好几天,但似乎仍无法让它发挥作用。选择和取消选择功能是有效的,它将对象添加到阵列但是在取消选择后,我不知道如何从阵列中删除相同的对象。如何取消选择单元格并从阵列中删除?

这是我的代码:

    struct Friends {
    var friendName : String!
}

struct SelectedMembers {
    var selectedFriend : String!
}


    var friends = [Friends]()
    var selectedFriends = [SelectedMembers]()

        //MARK: Select multiple cells
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        let cell = collectionView.cellForItem(at: indexPath) as? FriendsCell
        selectedCell.append(indexPath)
        cell?.contentView.backgroundColor = .red
        print("Friends are: \(String(describing: cell?.nameSurname.text!))")

        if (cell?.isSelected)! {
            print("this is selected...")
            var selection = SelectedMembers()
            selection.selectedFriend = friends[indexPath.item].friendName
            selectedFriends.append(selection)

            print(selectedFriends)

        }




    }

    //MARK: Deselect Multiple cells
    func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) {
        let deselectedCell = collectionView.cellForItem(at: indexPath) as? FriendsCell
        print(indexPath.row)
        if let index = selectedFriends.index(of: selectedFriends[indexPath.row]) {
            selectedFriends.remove(at: index)
        }

        if selectedCell.contains(indexPath) {
            selectedCell.remove(at: selectedCell.index(of: indexPath)!)
            deselectedCell?.contentView.backgroundColor = .white
            print(selectedCell)
        }


        print(selectedFriends)
    }
}

2 个答案:

答案 0 :(得分:1)

这段代码是罪魁祸首。

  

如果让index = selectedFriends.index(of:selectedFriends [indexPath.row]){selectedFriends.remove(at:index)}

例如,如果您有100行,并且如果您选择了1个,10个,50个单元格,那么 selectedFriends 数组只包含3个对象,但当有人取消选择50个单元格时,上面的代码,你试图访问selectedFriends [50] ..所以它是不正确的。

  

您无需维护 selectedCell 数组来跟踪选定/未选定的索引。每当选择一个单元格时,您将在didSelecte中获得回调,只能取消选择所选单元格。

将以下代码放在didDeselect()

let deselectedCell = collectionView.cellForItem(at: indexPath) as? FriendsCell
deselectedCell?.contentView.backgroundColor = .white
let friendName = friends[indexPath.item].friendName
var deselectedIndex:Int
for (index,value) in selectedFriends.enumerated() { if value.friendName == freindName { deselectedIndex = index }}
selectedFriends.remove(at:deselectedIndex}
  

如果您的朋友列表更多,最好使用Dictionary,这样您就可以避免for循环找到取消选择的朋友。如果继续执行数组实现,则实现Equatable协议,而不是检查唯一的名称。

答案 1 :(得分:1)

据我所知,在“SelectedMembers”对象中创建一个isSelected键,并更改选定和未选定单元格的键值,然后重新加载tableView。 最后,您将通过简单循环检索所选单元格的数组。

其他明智地使用它

 extension SelectRecipeViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let product =  self.productList[indexPath.row]
    if arraySelectedProduct.contains(recipe) {
        let index = arraySelectedRecipes.index(of: recipe)
        arraySelectedProduct.remove(at: index!)
    } else {
        arraySelectedProduct.append(recipe)
    }
    tableView.reloadRows(at: [indexPath], with: .none)
}
}