Почему мой вид вкладки не перезагружается после того, как я сохраняю данные данных и вызываю функцию tableview.reloadData()

Я не понимаю, почему мое табличное представление не перезагружается после вызова функции tableView.reloadData(). Вот что вы должны знать о моем проекте. Начальный контроллер представления — это tableViewController, и когда вы нажимаете кнопку «Добавить» на панели навигации, он выдвигается и представляет addItemViewController. Он представлен поверхCurrentContext. Все до этого момента работает нормально, но часть, которая не работает, - это когда вы заполняете информацию во всплывающем окне, которое я создал, и нажимаете кнопку, чтобы сохранить ее, она сохраняется в основном заполнении данных, но когда я перезагружаю ее, она даже не назовите это. Когда я закрываю приложение и перезагружаю его, данные отображаются, но они не отображаются, когда я добавляю их и вызываю ту же функцию.

import UIKit
import CoreData
protocol reloadTableView: class {
    func reloadTableView()
}
class TableViewController: UITableViewController {
    
    //Global Variables
    let addItemVC = AddItemController()
    var itemArray = [Item]()
    let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
    
    override func viewDidLoad() {
        super.viewDidLoad()
        addItemVC.delegate = self
        loadItems()
    }

    // MARK: - Table view data source
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return itemArray.count
    }
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: Constants.cellIdentifier, for: indexPath) as! Cell
        let array = itemArray[indexPath.row]
        cell.dateCreated.text = array.dateCreated
        cell.workoutLabel.text = array.workoutName
        cell.weightLifted.text = array.weight
        return cell
    }

//MARK: - Add Button Pressed
    @IBAction func addItemPressed(_ sender: UIBarButtonItem) {
        let storyboard = UIStoryboard(name: "AddItem", bundle: nil)
        let addItemVC = storyboard.instantiateViewController(identifier: "AddItemController")
        addItemVC.isModalInPresentation = true
        addItemVC.modalPresentationStyle = .overCurrentContext
        addItemVC.modalTransitionStyle = .crossDissolve
        addItemVC.navigationController?.isNavigationBarHidden = true
        present(addItemVC, animated: true, completion: nil)
    }
    
    
    
    
    
    
//MARK: - Create and Load Functions
    func saveData() {
        do {
            try context.save()
        } catch {
            print("Error Saving Data \(error)")
        }
        tableView.reloadData()
    }
    func loadItems() {
        let request: NSFetchRequest<Item> = Item.fetchRequest()
           do {
           itemArray = try context.fetch(request)
           } catch {
               print("error")
           }
        tableView.reloadData()
    }
}

//MARK:// - Add Item Vc Delegate
extension TableViewController: reloadTableView {
    func reloadTableView() {
        do {
            try context.save()
        } catch {
            print("Error Saving Data \(error)")
        }
        let request: NSFetchRequest<Item> = Item.fetchRequest()
           do {
           itemArray = try context.fetch(request)
           } catch {
               print("error")
        }
        tableView.reloadData()
        print("There are", itemArray.count, "in the item array")
        print(itemArray.last?.workoutName)
          //the print statement are not showing up in console
    }
}

и второй файл


import UIKit
import CoreData

class AddItemController: UIViewController {
    
    let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
    var delegate: reloadTableView?
    
    @IBOutlet weak var viewContainer: UIView!
    @IBOutlet weak var exercise: UITextField!
    @IBOutlet weak var weight: UITextField!
    @IBOutlet weak var reps: UITextField!
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    @IBAction func addMaxPressed(_ sender: UIButton) {
        if exercise.text != "" &&  weight.text != "" &&  reps.text != "" {
            let newItem = Item(context: context)
            let formatter = DateFormatter()
            newItem.dateCreated = formatter.formattedDate()
            newItem.weight = weight.text
            newItem.reps = reps.text
            newItem.workoutName = exercise.text
            dismiss(animated: true) {
                self.delegate?.reloadTableView()
            }
        }
    }
    @IBAction func exitPressed(_ sender: UIButton) {
        dismiss(animated: true, completion: nil)
    }
}

//MARK: - UITextField func
extension AddItemController: UITextFieldDelegate {
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        self.view.endEditing(true)
        return true
    }
}


person User013048294    schedule 29.08.2020    source источник


Ответы (1)


Вы устанавливаете делегата на неправильный экземпляр контроллера представления добавления элемента. Вы создаете один экземпляр с...

let addItemVC = AddItemController()

...и еще один с...

let addItemVC = storyboard.instantiateViewController(identifier: "AddItemController")

Вы устанавливаете делегата на первый из них, но представляете второй. Это означает, что когда вы доберетесь до...

self.delegate?.reloadTableView()

...представленного контроллера ничего не происходит.

Если вы не используете первый экземпляр, избавьтесь от него и установите делегат в том же разделе, где вы устанавливаете стиль презентации и т. д.

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

person Phillip Mills    schedule 29.08.2020
comment
Я попытался удалить экземпляр вверху и использовать экземпляр в экземпляре, где я представляю, а также сделать оператор if, чтобы проверить, является ли делегат нулевым. Когда я запускал это, моя ошибка не печаталась, но я не думаю, что функции делегата тоже работали - person User013048294; 01.09.2020
comment
Я предлагаю использовать отладчик, чтобы поставить точку останова, где вы вызываете делегата. Затем вы можете войти в разговор и точно увидеть, что происходит. - person Phillip Mills; 01.09.2020