从CoreData删除记录后如何重新加载tableView?

问题描述 投票:-1回答:1

我已经搜索了所有答案,并尝试了所有选项,但仍然无法正常工作。我有一个ViewController,用于从核心数据中删除记录。然后,我从堆栈中删除一个viewcontroller以重新回到tableview上。 tableview仍然有我在行中删除的记录!我已经使用了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
            }
    }
}

}
ios swift tableview reloaddata viewwillappear
1个回答
0
投票

由于控制器缺少代码,我不确定100%,但是您是否覆盖了负责填充表的表委托方法。您能告诉我们整个控制器吗?我们需要同时看到以下两种委托方法。如果正确执行此操作,则tableView将从reload方法重新加载。

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

但是,这个问题可能完全是另外一个问题。请向我们显示控制器的完整代码。


感谢您显示您的完整代码。您的代码似乎有几个问题。您在视图上有2个不同的表吗?您是指两个不同的表WeekendTableView和tableView吗?行数方法需要返回数据集计数(现在您正在编写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()



                 }

尝试一下

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

 tableView.reloadData()
© www.soinside.com 2019 - 2024. All rights reserved.