#ios #swift #tableview #reloaddata #swift4.2
#iOS #swift #tableview #reloaddata #swift4.2
Вопрос:
Я новичок в swift и sqlite3, и мне нужна помощь в том, как удалить из tableview и sql db.
Я пытался использовать reloadData (), но это не работает. Я попытался удалить с помощью tableView.deleteRows(at: [indexPath], with: .fade)
, но я получаю сообщение об ошибке, так как перед этим у меня была запущена инструкция sql delete. С помощью этого кода, приведенного ниже, я успешно могу удалить элемент из базы данных, но он не обновляет tableview. Способ, которым я смог временно исправить это, — выполнить переход к предыдущему экрану после успешного удаления элемента, и при возвращении в tableviewcontroller он будет удален.
import UIKit
class TableViewController: UIViewController,UITableViewDataSource,UITableViewDelegate {
let mainDelegate = UIApplication.shared.delegate as! AppDelegate
@IBOutlet var tableView: UITableView!
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let tableCell = tableView.dequeueReusableCell(withIdentifier: "cell") as? SiteCell ?? SiteCell(style: .default, reuseIdentifier: "cell")
let rowNum = indexPath.row
tableCell.primaryLabel.text = mainDelegate.people[rowNum].name
tableCell.secondaryLabel.text = mainDelegate.people[rowNum].email
tableCell.myImageView.image = UIImage(named: mainDelegate.people[rowNum].avatar!)
tableCell.accessoryType = .disclosureIndicator
return tableCell
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return mainDelegate.people.count
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 70
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let rowNum = indexPath.row
let details : String! = "Address: (mainDelegate.people[rowNum].address!) nPhone Num: (mainDelegate.people[rowNum].phonenum!) nEmail: (mainDelegate.people[rowNum].email!) nAge: (mainDelegate.people[rowNum].age!) nGender: (mainDelegate.people[rowNum].gender!) nDate of birth: (mainDelegate.people[rowNum].dob!)"
let alertController = UIAlertController(title: mainDelegate.people[rowNum].name, message: details, preferredStyle: .alert
)
let cancelAction = UIAlertAction(title: "ok", style: .cancel, handler: nil)
print("TESTING ROW: (mainDelegate.people[rowNum].id!)")
alertController.addAction(cancelAction)
present(alertController, animated: true)
}
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
var rowNum: Int = indexPath.row
if editingStyle == .delete {
print("Testing delete (mainDelegate.people[rowNum].id!)")
print("(indexPath.row)")
mainDelegate.removeFromDatabase(id: mainDelegate.people[rowNum].id!)
print("(indexPath)")
// tableView.deleteRows(at: [indexPath], with: .fade)
DispatchQueue.main.async{
self.tableView.reloadData()
}
// self.performSegue(withIdentifier: "DataToInfo", sender: self)
// let mainDelegate = UIApplication.shared.delegate as! AppDelegate
// mainDelegate.removeFromDatabase(person: mainDelegate.people[indexPath.row])
}
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
mainDelegate.readDataFromDatabase()
}
Метод removeFromDatabase
func removeFromDatabase(id : Int){
var db : OpaquePointer? = nil
if sqlite3_open(self.databasePath, amp;db) == SQLITE_OK{
print("Successfully opened connection to database at (self.databasePath)")
var deleteStatement : OpaquePointer? = nil
let deleteStatementString : String = "delete from entries where id=(id)"
if sqlite3_prepare_v2(db, deleteStatementString, -1, amp;deleteStatement, nil) == SQLITE_OK{
if sqlite3_step(deleteStatement) == SQLITE_DONE{
print("Deleted")
}
else{
print("Failed")
}
}else{
print("Couldn't prepare")
}
sqlite3_finalize(deleteStatement)
sqlite3_close(db)
}
}
Я пытаюсь удалить его из tableview, а также из базы данных. В какой-то момент я пытался
mainDelegate.people.remove(at: indexPath.row)
tableView.deleteRows(at: [indexPath], with: .fade)
затем запустил removeFromDatabase, но это выдавало ошибку.
Комментарии:
1. вы должны обновить свой источник данных перед перезагрузкой tableview
2. @AntonNovoselov как именно я могу это сделать? и есть ли способ сохранить стиль анимации .fade при удалении его из моей базы данных?
3. Я не знаю, как реализован ваш источник данных и как реализовано удаление из базы данных. Метод cellForRow — где он выводит объекты для отображения?
4. @AntonNovoselov Я обновил сообщение, включив в него весь tableviewcontroller, а также метод removefromdatabase
Ответ №1:
Вам следует обновить свой источник данных. Попробуйте реорганизовать вашу фиксацию следующим образом:
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
var rowNum: Int = indexPath.row
if editingStyle == .delete {
print("Testing delete (mainDelegate.people[rowNum].id!)")
print("(indexPath.row)")
mainDelegate.removeFromDatabase(id: mainDelegate.people[rowNum].id!)
print("(indexPath)")
mainDelegate.readDataFromDatabase()
tableView.deleteRows(at: [indexPath], with: .fade)
}
}