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我也很好奇它是否可以运行