Как обновить tableview, когда пользователь вставляет элемент в базу данных?

#swift #sqlite

#swift #sqlite

Вопрос:

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

Я снова перезагружаю базу данных в MainController внутри viewDidLoad(). Я также пытался выполнить TableView.reloadData() внутри viewDidLoad(), и это ничего не дает.

 class MainViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

    @IBOutlet weak var tableView: UITableView?
    let mainDelegate = UIApplication.shared.delegate as! AppDelegate


    override func viewDidLoad() {
        super.viewDidLoad()
        // read from the database
        mainDelegate.readDataFromDatabase()

    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return mainDelegate.people.count

    }

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

        let cell = tableView.dequeueReusableCell(withIdentifier: "BookTableViewCell") as! BookTableViewCell

        let rowNum = indexPath.row

        cell.lblTitle?.text = mainDelegate.people[rowNum].title
        cell.accessoryType = .disclosureIndicator

        return cell
    }



class NewBookItemViewController: UIViewController, UITextFieldDelegate, UINavigationControllerDelegate {

    @IBOutlet weak var titletxt : UITextField!

    @IBAction func buttonSave(sender: UIButton){
         // step 18b - instantiate Data object and add textfield data
            let person : Data = Data.init()
            person.initWithData(theRow: 0, thetitle: title)

            let mainDelegate = UIApplication.shared.delegate as! AppDelegate

            // step 18c - do the insert into db
            let returnCode : Bool = mainDelegate.insertIntoDatabase(person: person)      


        }
  

Комментарии:

1. viewDidLoad не будет вызываться при возврате из другого представленного UIViewController. Он уже «загружен». Вы можете попробовать viewWillAppear . Существуют и другие способы передачи информации обратно в представляющий контроллер.

Ответ №1:

Вам нужно

 override func viewWillAppear(_ animated:Bool) {
  super.viewWillAppear(animated)
  mainDelegate.readDataFromDatabase()
  tableView.reloadData()
}
  

Как viewDidLoad вызывается один раз при загрузке vc, также AppDelegate не отвечает за выполнение таких действий, учитывая наличие класса источника данных, который обрабатывает чтение / запись из базы данных