Как перезагрузить tableView после удаления записи из CoreData? - PullRequest
0 голосов
/ 14 марта 2020

Я искал каждый ответ для этой попытки, все опции все равно не будут работать. У меня есть viewcontroller, где я удаляю запись из основных данных. Затем я удаляю viewcontroller из стека, чтобы вернуться к таблице. в таблице еще есть запись, которую я удалил в строке! Я использовал каждую комбинацию, которую могу придумать tableView.reloadData() в viewDidAppear, а также viewDidLoad. Ничто не перезагружает данные! Если я вернусь к предыдущему виду таблицы, данные верны, и я перейду вперед, данные исчезнут, как и должно быть. У меня заканчиваются варианты Пожалуйста, помогите.

import UIKit

class showWeekTableViewController: UITableViewController {
    var dailyEntry = [DailyEntry]()
    var week = Date()
    var weekArray = [Date]()
    var firstDay = Date()
    var hour = Double()
    var hoursArray = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]

    @IBOutlet var weeksTableView: UITableView!


    override func viewDidLoad() {
        super.viewDidLoad()



        selectedWeekArray()
        getDailyEntries()
        getHoursArray()
        tableView.reloadData()

    }


    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(true)

       selectedWeekArray()
        getDailyEntries()
       print("viewwillappear")
        getHoursArray()

        weeksTableView.reloadData()

    }



    // MARK: - Table view data source
/*
    override func numberOfSections(in tableView: UITableView) -> Int {
        // #warning Incomplete implementation, return the number of sections
        return 1
    }
*/
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
        return 7
    }

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

        let cell = UITableViewCell()
        let dateFormatter = DateFormatter()
        dateFormatter.dateStyle = .short
        dateFormatter.dateFormat = "E-MM-dd-yyyy"

        let firstDay = dateFormatter.string(from: weekArray[indexPath.row])
        let tempHour = hoursArray[indexPath.row]

        // Configure the cell...
        if tempHour == 0.0  {
            cell.textLabel?.alpha = 0.50
            cell.isUserInteractionEnabled = false
        }
        cell.textLabel?.text = ("\(firstDay)                        \(tempHour)")

        return cell
    }
    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        let selectedDay = weekArray[indexPath.row]
        performSegue(withIdentifier: "moveToShowSelectedDay", sender: selectedDay)
        print("first")
        print(selectedDay)
    }





    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using segue.destination.
        // Pass the selected object to the new view controller.
    }
    */

    func selectedWeekArray()  {
        var tempWeek = week

        for _ in 0...6 {

            weekArray.append(tempWeek)

            tempWeek = tempWeek + (86400)

        }

    }

    func getDailyEntries() {
         if let context = (UIApplication.shared.delegate as? AppDelegate)?.persistentContainer.viewContext{
             if let dailyEntries = try?
                 context.fetch(DailyEntry.fetchRequest()) {
                 if var tempDailyEntries = dailyEntries as? [DailyEntry] {
                     tempDailyEntries.sort(by: { $0.date!.compare($1.date!) == .orderedAscending})

                     dailyEntry = tempDailyEntries
                     tableView.reloadData()


                 }


             }
         }


     }


    func getHoursArray() {

        // load hours for each day in the week

        let dateFormatter = DateFormatter()
        dateFormatter.dateStyle = .short
        dateFormatter.dateFormat = "MM-dd-yyyy"

        for x in 0...6 {

            for z in 0...dailyEntry.count-1 {
                if dateFormatter.string(from: weekArray[x]) == dateFormatter.string(from: dailyEntry[z].date!) {
                    let tempHours = Double(dailyEntry[z].hours!)!
                    hoursArray[x] = tempHours
                }
            }
        }

        tableView.reloadData()

    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {


        if let dayVC = segue.destination as?  showSelectedDayViewController {
            if let selectedDay = sender as! Date? {
                dayVC.selectedDay = selectedDay
            }
    }
}

}

1 Ответ

0 голосов
/ 14 марта 2020

Я не уверен на 100% из-за отсутствующего кода вашего контроллера, но вы переопределили методы делегата таблицы, отвечающие за заполнение таблицы. Можете ли вы показать нам весь контроллер? Нам нужно увидеть оба следующих метода делегата. Если вы сделали это правильно, то tableView перезагрузится из метода перезагрузки.

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int)
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath)

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


Спасибо за отображение всего кода. Кажется, есть несколько проблем с вашим кодом. У вас есть 2 разных таблицы в представлении? Вы ссылаетесь на 2 разные таблицы Выходные таблицы и табличные представления? Метод количества строк должен возвращать количество наборов данных (сейчас вы пишете в 7. Это означает, что таблица всегда будет иметь 7 строк). Вам нужно динамически получить счет из набора данных.


Попробуйте переместить перезагрузку после выборки


вместо вашего кода

context.fetch(DailyEntry.fetchRequest()) {
                 if var tempDailyEntries = dailyEntries as? [DailyEntry] {
                     tempDailyEntries.sort(by: { $0.date!.compare($1.date!) == .orderedAscending})

                     dailyEntry = tempDailyEntries
                     tableView.reloadData()



                 }

try это

do{
    dailyEntry = try context.fetch(DailyEntry.fetchRequest())
  } catch {
    print("Error loading Daily Entry \(error)")
  }

 tableView.reloadData()
...