web-dev-qa-db-fra.com

Swift: 'tenter de supprimer une ligne d'une section contenant uniquement des lignes avant la mise à jour'

Pourquoi est-ce que je reçois cette erreur? Qu'est-ce que je dois faire?

* Échec de l'assertion dans - [UITableView _endCellAnimationsWithContext:], /BuildRoot/Library/Caches/com.Apple.xbs/Sources/UIKit/UIKit-3600.8.1/UITableView.m:1442 2017-07 -06 20: 25: 30.736267-0400 BlogApp [1482: 340583] * Application terminée en raison d'une exception non interceptée 'NSInternalInconsistencyException', raison: 'tente de supprimer la ligne 0 de la section 0 qui ne contient que 0 lignes avant la mise à jour'

Le crash est là

// ----- Inserting Cell to followedArray -----
let blogObject: Blog = filteredArray[indexPath.section][indexPath.row]
let indexOfObjectInArray = mainArray.index(of: blogObject)

followedArray.insert(blogObject, at: 0)

// ----- Removing Cell from filteredArray -----
filteredArray.remove(at: [indexPath.section][indexPath.row])
mainArray.remove(at: indexOfObjectInArray!)
let rowToRemove = indexPath.row
self.myTableView.deleteRows(at: [IndexPath(row: rowToRemove, section: 0)], with: .fade)

self.myTableView.endUpdates()

Je n'ai jamais travaillé avec un tableau de tableaux var filteredArray = [[Blog]](), alors peut-être que je n'y accède pas ou que je ne le supprime pas correctement.

Je venais juste d’afficher mon message sur la résolution du problème que je rencontrais dans la barre de recherche, mais j’ai essayé de résoudre ce problème. Cela se produit lorsque je clique sur le bouton Suivre lors de la recherche d'un objet. Cela dépasse mon entendement car je suis nouveau dans le code SearchBar. 

Il y a un problème lors de la suppression de la cellule de filterArray. Peut-être que vous n'y accédez pas correctement pour qu'il ne puisse pas le supprimer? J'avais configuré des points d'arrêt ligne par ligne et il se bloquait lors de la suppression de la cellule de filtréeArray

De plus, j'ai eu un problème général avec SearchBar et j'ai un nouveau code, alors peut-être que cela peut aider.

Swift: permet à SearchBar d'effectuer une recherche dans les deux sections et de ne pas les combiner

Pour toute autre information s'il vous plaît faites le moi savoir, merci.

// Follow Button
@IBAction func followButtonClick(_ sender: UIButton!) {

    // Adding row to tag
    let buttonPosition = (sender as AnyObject).convert(CGPoint.zero, to: self.myTableView)
    if let indexPath = self.myTableView.indexPathForRow(at: buttonPosition) {

        // Change Follow to Following
        (sender as UIButton).setImage(UIImage(named: "follow.png")!, for: .normal)
        cell.followButton.isHidden = true
        cell.followedButton.isHidden = false

        // Checking wether to import from mainArray or filteredArray to followedArray
        if !(searchController.isActive && searchController.searchBar.text != "") {

            self.myTableView.beginUpdates()

            // Save identifier into followedIdentifier array
            self.followedIdentifiers.insert(mainArray[indexPath.row].blogID)

            // ----- Inserting Cell to followedArray -----
            followedArray.insert(mainArray[indexPath.row], at: 0)
            myTableView.insertRows(at: [IndexPath(row: 0, section: 0)], with: .fade)

            // ----- Removing Cell from mainArray -----
            mainArray.remove(at: indexPath.row)
            let rowToRemove = indexPath.row
            self.myTableView.deleteRows(at: [IndexPath(row: rowToRemove, section: 1)], with: .fade)

            self.myTableView.endUpdates()

            // After Updating Table, Save the Archived Data to File Manager
            saveData()
        }
        else { // **** Crash in this section ****

            self.myTableView.beginUpdates()

            // Remove identifier into followedIdentifier array
            self.followedIdentifiers.remove(followedArray[indexPath.row].blogID)

            // ----- Inserting Cell to followedArray -----
            let blogObject: Blog = filteredArray[indexPath.section][indexPath.row]
            let indexOfObjectInArray = mainArray.index(of: blogObject)

            followedArray.insert(blogObject, at: 0)

            //------------------------
            // CRASH SHOULD BE HERE (breakpoints lead me here)
            //------------------------

            // ----- Removing Cell from filteredArray -----
            filteredArray.remove(at: [indexPath.section][indexPath.row])
            mainArray.remove(at: indexOfObjectInArray!)
            let rowToRemove = indexPath.row
            self.myTableView.deleteRows(at: [IndexPath(row: rowToRemove, section: 0)], with: .fade)

            self.myTableView.endUpdates()

            // After Updating Table, Save the Archived Data to File Manager
            saveData()
        }
    }
}

Reste de mon code, peut-être aide à résoudre le problème

var mainArray = [Blog]()
var followedArray = [Blog]()
var filteredArray = [[Blog]]()

// Number of Rows in Section
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    if !(searchController.isActive && searchController.searchBar.text != "") {

        if section == 0 {
            return followedArray.count
        } else {
            return mainArray.count
        }
    } else {
        return filteredArray[section].count
    }
}

// CellForRowAt indexPath
public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let CellIdentifier = "Cell"
    var cell = tableView.dequeueReusableCell(withIdentifier: CellIdentifier) as! CustomCell

    if cell != cell {
        cell = CustomCell(style: UITableViewCellStyle.default, reuseIdentifier: CellIdentifier)
    }

    // Configuring the cell
    var blogObject: Blog

    if !(searchController.isActive && searchController.searchBar.text != "") {
        if indexPath.section == 0 {
            blogObject = followedArray[indexPath.row]
            cell.populateCell(blogObject, isFollowed: true, indexPath: indexPath, parentView: self)
        } else {
            blogObject = mainArray[indexPath.row]
            cell.populateCell(blogObject, isFollowed: false, indexPath: indexPath, parentView: self)
        }
    } else {
        blogObject = filteredArray[indexPath.section][indexPath.row]
        cell.populateCell(blogObject, isFollowed: false, indexPath: indexPath, parentView: self)
    }

    return cell
}

Bouton de non-suivi

Le même problème devrait être ici car c'est l'opposé du bouton Suivre.

// Unfollow Button
@IBAction func followedButtonClick(_ sender: UIButton!) {

    // Adding row to tag
    let buttonPosition = (sender as AnyObject).convert(CGPoint.zero, to: self.myTableView)
    if let indexPath = self.myTableView.indexPathForRow(at: buttonPosition) {

        // Change Following to Follow
        (sender as UIButton).setImage(UIImage(named: "followed.png")!, for: .normal)
        cell.followButton.isHidden = false
        cell.followedButton.isHidden = true

        self.myTableView.beginUpdates()

        // Remove identifier into followedIdentifier array
        self.followedIdentifiers.remove(followedArray[indexPath.row].blogID)

        // ----- Inserting Cell to mainArray -----
        mainArray.insert(followedArray[indexPath.row], at: 0)
        myTableView.insertRows(at: [IndexPath(row: 0, section: 1)], with: .fade)

        // ----- Removing Cell from followedArray -----
        followedArray.remove(at: indexPath.row)
        let rowToRemove = indexPath.row
        self.myTableView.deleteRows(at: [IndexPath(row: rowToRemove, section: 0)], with: .fade)

        self.myTableView.endUpdates()

        // After Updating Table, Save the Archived Data to File Manager
        saveData()
    }
}
6
WokerHead

Vous devez d'abord supprimer la cellule de TableView! 

// ----- Removing Cell from filteredArray -----
self.myTableView.deleteRows(at: [indexPath], with: .fade)
filteredArray.remove(at: [indexPath.section][indexPath.row])
mainArray.remove(at: indexOfObjectInArray!)

Essaye le.

1
A. Amini