Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift&x2013;关闭视图控制器后未重新加载表视图数据_Ios_Swift_Uitableview_Core Data - Fatal编程技术网

Ios Swift&x2013;关闭视图控制器后未重新加载表视图数据

Ios Swift&x2013;关闭视图控制器后未重新加载表视图数据,ios,swift,uitableview,core-data,Ios,Swift,Uitableview,Core Data,我在我的应用程序中有一个名为JournalViewController的视图,我正在通过我的PastSessionViewController演示该视图PastSessions有一个表格视图,用户可以点击该视图编辑和调出日志 当用户编辑一个条目并保存它(保存到CoreData)时,取消JournalViewController我希望在PastSessions中的表格视图反映这些更改并显示更新的表格单元格 我正在调用PastSessionViewControllerviewDidLoad()中的t

我在我的应用程序中有一个名为
JournalViewController
的视图,我正在通过我的
PastSessionViewController
演示该视图
PastSessions
有一个表格视图,用户可以点击该视图编辑和调出日志

当用户编辑一个条目并保存它(保存到CoreData)时,取消
JournalViewController
我希望在
PastSessions
中的表格视图反映这些更改并显示更新的表格单元格

我正在调用
PastSessionViewController
viewDidLoad()
中的
tableView.reloadData()
,但这似乎不起作用。我还为
JournalViewController
添加了一个委托,以便在
dismissViewController
之前与
PastSessionViewController
进行交互

下面是一些代码:

PastSessionViewController
中:

class PastSessionsViewController: UIViewController, UITableViewDelegate, JournalVCDelegate {
    weak var tableView: UITableView?
    weak var backButton: UIButton?

    let pastSessionsDataSource: PastSessionsDataSource

    init() {
        pastSessionsDataSource = PastSessionsDataSource()
        super.init(nibName: nil, bundle: nil)
    }

    required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        let tableView = UITableView()
        tableView.backgroundColor = nil
        tableView.delegate = self
        tableView.dataSource = pastSessionsDataSource
        tableView.registerClass(EntryCell.self, forCellReuseIdentifier: "cell")
        view.addSubview(tableView)
        self.tableView = tableView
    }

    override func viewDidAppear(animated: Bool) {
        tableView?.reloadData()
    }

    func didFinishJournalVC(controller: JournalViewController) {
        var newDataSource = PastSessionsDataSource()
        tableView?.dataSource = newDataSource
        // tried this ^, but it's causing the app to crash 

        // tableView?.reloadData() <- this isn't doing the trick either
        dismissViewControllerAnimated(true, completion: nil)
    }

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        let editJournalVC = JournalViewController(label: "Edit your thoughts")
        editJournalVC.delegate = self

        presentViewController(editJournalVC, animated: true, completion: nil)
    }
}
PastSessionDataSource
中:

   import UIKit
   import CoreData

   class PastSessionsDataSource: NSObject {
        var arrayOfEntries = [Entry]()
        var coreDataReturn: [Meditation]?

        func prepareEntries() {
          // gets stuff from coredata and formats it appropriately
        }

        override init() {
            super.init()
            prepareEntries()
        }
    }

    extension PastSessionsDataSource: UITableViewDataSource {
        func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return arrayOfEntries.count
        }

        func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! EntryCell

            ... set up the labels in the cell ...

            return cell
        }
    }

谢谢你的关注

viewDidLoad
在视图控制器第一次加载其视图时被调用,因此基本上在视图控制器的整个生命周期内只调用一次。
一个快速的解决方案是将
tableView.reloadData()
放入
PastSessionViewController视图willDisplay()或ViewDidDisplay()


但是,我不喜欢这种快速解决方案,因为每次您关闭
JournalViewController
,表视图都会重新加载,即使用户没有在
JournalViewController
上更改任何内容(例如,取消编辑)。因此,我建议在
PastSessionViewController
JournalViewController
之间使用委托方法,当用户在
JournalViewController
上实际编辑数据时,通知
PastSessionsViewController
刷新表。

viewDidLoad在视图控制器第一次加载其视图时被调用,因此在视图控制器的整个生命周期内基本上只调用一次。
一个快速的解决方案是将
tableView.reloadData()
放入
PastSessionViewController视图willDisplay()或ViewDidDisplay()


但是,我不喜欢这种快速解决方案,因为每次您关闭
JournalViewController
,表视图都会重新加载,即使用户没有在
JournalViewController
上更改任何内容(例如,取消编辑)。因此,我建议在
PastSessionViewController
JournalViewController
之间使用委托方法,当用户在
JournalViewController
上实际编辑数据时,请通知
PastSessionViewController
刷新表。

您当前仅在PastSessionDataSource的init上准备条目,而不是在您进行CoreData更改之后。因此,每次为tableView重新加载数据时,都使用最初加载的相同数据集。作为一种快速攻击,您可以尝试以以下方式显示更新的ViewDid:

 override func viewDidAppear(animated: Bool) {
        if let tableView = tableView {
          let dataSource = tableView.dataSource! as PastSessionsDataSource
          dataSource.prepareEntries()
          tableView.reloadData()
        }
 }

您当前仅在PastSessionDataSource的init上准备条目,而不是在更改CoreData之后。因此,每次为tableView重新加载数据时,都使用最初加载的相同数据集。作为一种快速攻击,您可以尝试以以下方式显示更新的ViewDid:

 override func viewDidAppear(animated: Bool) {
        if let tableView = tableView {
          let dataSource = tableView.dataSource! as PastSessionsDataSource
          dataSource.prepareEntries()
          tableView.reloadData()
        }
 }

根据列出的代码,
tableView
属性在
viewdide
中可能是
nil
。原因是在
viewDidLoad
中,您将
UITableView
构造为
tableView
,这是一个局部变量。您需要将该变量指定给属性:


self.tableView=tableView

根据列出的代码,您的
tableView
属性在
viewdide
中可能是
nil
。原因是在
viewDidLoad
中,您将
UITableView
构造为
tableView
,这是一个局部变量。您需要将该变量指定给属性:


self.tableView=tableView

上述代码中没有可见问题。同样在viewDidLoad的示例中,我没有看到调用reloadData。你试过调试它吗?从核心数据加载的数据是否正确?是否调用了数据源的方法?上述代码中没有可见问题。同样在viewDidLoad的示例中,我没有看到调用reloadData。你试过调试它吗?从核心数据加载的数据是否正确?是否调用了数据源的方法?是否应该使用委托调用PastSessionDataSource类来更新数据?因为那是CoreData加载和填充表视图单元格的地方?我很困惑如何解决这个问题。我使用委托方法更新了上面的代码,它仍然不起作用,您介意看一下吗?我应该使用委托调用PastSessionDataSource类来更新数据吗?因为那是CoreData加载和填充表视图单元格的地方?我很困惑如何解决这个问题。我用委托方法更新了上面的代码,它仍然不起作用,你介意看一下吗?我明白你的意思了。不幸的是,这不起作用either@ZackShapiro你得到了什么?编译错误,崩溃,没有更新内容?我没有完整的安装程序,因此无法在我的机器上运行。@ZackShapiro您能提供详细信息说明它实际上是如何工作的吗?@ZackShapiro我也很好奇prepareEntries是否每次都打电话来?你能检查一下这个吗?因为如果是这样的话,问题在于数据,而不是数据的呈现。在关闭
JournalViewController
并查看
passsessions
后,表视图的内容没有变化,我明白你的意思了。不幸的是,这不起作用either@ZackShapiro你得到了什么?编译错误,崩溃,没有更新内容?我没有完整的安装程序,因此无法在我的机器上运行。@ZackShapiro您能提供详细信息说明它实际上是如何不工作的吗?@ZackShapiro我也很好奇它是否可以运行