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



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

这是我的代码:

    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)
    }
}

此代码是罪魁祸首。

如果让index = selected friends.s.index(of:selected friends [indexpath.row]){selectionfriends.remove(at:index)}

例如,如果您有100行,并且如果您选择了1、10、50个单元格,则您的 selected friends array仅包含3个对象,但是当某人将50个单元格取消时,您正在尝试访问Selected Friends [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}

最好使用字典,如果您的朋友列表更多,因此您可以避免使用for循环以找到被取消的朋友。如果您继续执行Array实现,则实现Equatable协议,而不是检查唯一的名称。

根据我的说法,在" 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)
}
}

最新更新