Массив, который не удаляет элементы правильно быстро 4

user9883052 спросил: 12 мая 2018 в 03:46 в: arrays

В моем приложении я использую tableView для демонстрации вариантов, где выходить на дату. Для этого у меня есть пара groups и subgroups.

Группы и подгруппы:

var mainGroups : [String] = ["Out On The Town", "Night In"]
let subGroups : [String] = ["Restaurants", "Activities", "Laid Back"]
let restaurantSubGroups : [String] = ["Dining", "Fast Food", "Desserts"]

So если щелкнуть ячейку Restaurant, она добавит mainGroup, создаст ячейки с строками restaurantSubGroup, и если щелкнуть ее снова, она удалит эти ячейки.

Для удаления я проверяю, была ли ранее нажата ячейка. Если это так, я удаляю строки restaurantSubGroups из основной группы и соответствующим образом обновляю ячейки. Довольно просто?

Проблема возникает с массивом. По той причине, что я не могу найти, он удаляет, dining и desserts из массива, но пропускает Fast Food и удаляет Laid Back вместо .

Вот код:

//Bools declared as class variables
var outOnTheTownIsActive : Bool = false
var restaurantIsActive : Bool = falsefunc tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath as IndexPath)
    cell.textLabel?.text = "\(mainGroups[indexPath.row])"    if mainGroups.contains((cell.textLabel?.text)!) {
        cell.textLabel?.textAlignment = .left
    }
    if subGroups.contains((cell.textLabel?.text)!) {
        cell.textLabel?.textAlignment = .center
    }
    if restaurantSubGroups.contains((cell.textLabel?.text)!) || activitySubGroups.contains((cell.textLabel?.text)!) || laidbackSubGroups.contains((cell.textLabel?.text)!) {
        cell.textLabel?.textAlignment = .right
    }
    cell.selectionStyle = .none
    return cell
}func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let cell = tableView.cellForRow(at: indexPath)
    let cellText = cell?.textLabel?.text    switch cellText {
    case "Out On The Town":
        print("\(String(describing: cell?.textLabel?.text)) is clicked and row is \(indexPath.row)")
        if outOnTheTownIsActive {
            alterArray(starting: 2, ending: 4)
            addDeleteCells(starting: 1, ending: 3, indexPath: indexPath, add: false)
            outOnTheTownIsActive = false
        } else {
            mainGroups.insert(contentsOf: subGroups, at: indexPath.row+1)
            addDeleteCells(starting: 1, ending: 3, indexPath: indexPath, add: true)
            outOnTheTownIsActive = true
        }    case "Restaurants":
       // print("\(String(describing: cell?.textLabel?.text)) is clicked and row is \(indexPath.row)")
        if restaurantIsActive {
            print("The items in the array are \(mainGroups) and i am removing \(mainGroups[2]), \(mainGroups[3]), and \(mainGroups[4])")
            alterArray(starting: 2, ending: 4)
            addDeleteCells(starting: 1, ending: 3, indexPath: indexPath, add: false)
            restaurantIsActive = false
            print("The new array is \(mainGroups)")
        } else {
            mainGroups.insert(contentsOf: restaurantSubGroups, at: indexPath.row+1)
            addDeleteCells(starting: 1, ending: 3, indexPath: indexPath, add: true)
            restaurantIsActive = true
        }     //   print("There are \(mainGroups.count) in the array and they are \(mainGroups)")    case "Dining":
        getAnnotations(query: "Restaurant", category: .restaurants, price: .twoDollarSigns)    case "Fast Food":
        getAnnotations(query: "Fast Food", category: .food, price: nil)    case "Desserts":
        getAnnotations(query: "Ice Cream", category: .food, price: nil)
}func addDeleteCells(starting : Int, ending: Int, indexPath : IndexPath, add : Bool) {
    for i in starting...ending {
        let iPath = IndexPath(row: indexPath.row+i, section: 0)
        indexPaths.append(iPath)
    }
    if add {
        annotationTableView.beginUpdates()
        annotationTableView.insertRows(at: indexPaths, with: .automatic)
        annotationTableView.endUpdates()
    } else {
        annotationTableView.beginUpdates()
        annotationTableView.deleteRows(at: indexPaths, with: .automatic)
        annotationTableView.endUpdates()
    }
    indexPaths.removeAll()
}func alterArray(starting: Int, ending : Int) {
    for i in starting...ending {
        print("In alterArray and removing \(mainGroups[i])")
        mainGroups.remove(at: i)
    }
}

и вот распечатка консоли при нажатии "Out on the Town" один раз, а затем "Рестораны" дважды :

The items in the array are ["Out On The Town", "Restaurants", "Dining", "Fast Food", "Desserts", "Activities", "Laid Back", "Night In"] and i am removing Dining, Fast Food, and Desserts
In alterArray and removing Dining
In alterArray and removing Desserts
In alterArray and removing Laid Back
The new array is ["Out On The Town", "Restaurants", "Fast Food", "Activities", "Night In"]

Любая идея относительно того, почему она пропускает Fast Food и удаляет Laid Back?

отмечено: ячейки добавляются и удаляются правильно, но поскольку содержимое массива не удаляется правильно, когда ячейка уходит с экрана и возвращается обратно, она воссоздается с неправильным текстом.


1 ответ

Есть решение
Sh_Khan ответил: 12 мая 2018 в 03:59

Потому что, когда первый цикл заканчивается, индексы массива изменяются

 mainGroups.remove(at: i)

, поэтому элемент, который будет удален, будет иметь низкий индекс (-1), чем тот, который следует удалить,

конец первого цикла Обеденный удаляется, поэтому этот

["Out On The Town", "Restaurants", "Dining",
"Fast Food", "Desserts", "Activities", "Laid Back", "Night In"]

будет (вы ожидаете Fast Food next)

["Out On The Town", "Restaurants", "Fast Food",
"Desserts", "Activities", "Laid Back", "Night In"]

, но индекс 3 теперь содержит Десерты

user9883052 ответил: 12 мая 2018 в 04:05
хорошо, да, я понял. Я просто изменил alterArray, поэтому он занимает начальное место и массив строк, которые я хочу удалить. Затем он просто перебирается из исходного места в массив.count и удаляет в mainGroup [start]. Благодаря!