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