Удалить при пролистывании, удаляет первый элемент в списке, когда вы проводите любой - PullRequest
0 голосов
/ 28 марта 2019

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

Вот моя функция контроллера представления, где я проводю и вызываю метод удаления.

func tableView(_ tableView: UITableView, leadingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? 
{

let modifyAction = UIContextualAction(style: .normal, title: "Modify", handler:
        { ac, view, success in
            var stmt: OpaquePointer?

            let deleteStatementStirng = "SELECT * FROM ShoppingList"
            if sqlite3_prepare(self.db, deleteStatementStirng, -1, &stmt, nil) != SQLITE_OK
            {
                print("error preparing delete")
            }

            if sqlite3_step(stmt) == SQLITE_ROW {
                let id = sqlite3_column_int(stmt, 0)
                self.deleteRow(itemId: Int32(id))
            }
            success(true)
        }
    )

    modifyAction.backgroundColor = .red
    return UISwipeActionsConfiguration(actions: [modifyAction])
}

А также моя функция удаления:

func deleteRow(itemId: Int32){
        let deleteStatementStirng = "DELETE FROM ShoppingList WHERE id = \(itemId)"

        var deleteStatement: OpaquePointer?

        if sqlite3_prepare(db, deleteStatementStirng, -1, &deleteStatement, nil) == SQLITE_OK{

            if sqlite3_step(deleteStatement) == SQLITE_DONE {
                print("Successfully deleted row.")
            } else {
                print("Could not delete row.")
            }
        } else {
            print("DELETE statement could not be prepared")
        }

        sqlite3_finalize(deleteStatement)
        readValues()

    }

Ожидаемый результат - удаление элемента из списка

Ответы [ 2 ]

0 голосов
/ 03 мая 2019

Просто обновите ваш код modifyAction с помощью: (Добавлен indexPath.row вместо 0 при получении идентификатора)

let modifyAction = UIContextualAction(style: .normal, title: "Modify", handler:
    { ac, view, success in
        var stmt: OpaquePointer?

        let deleteStatementStirng = "SELECT * FROM ShoppingList"
        if sqlite3_prepare(self.db, deleteStatementStirng, -1, &stmt, nil) != SQLITE_OK
        {
            print("error preparing delete")
        }

        if sqlite3_step(stmt) == SQLITE_ROW {
            let id = sqlite3_column_int(stmt, indexPath.row)
            self.deleteRow(itemId: Int32(id))
        }
        success(true)
    }
)
0 голосов
/ 16 апреля 2019

Вы должны использовать

indexPath.row

чтобы получить фактический индекс строки, над которой вы хотите выполнить действие.

...