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