- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
好吧,我对此是全新的,并且在阅读许多教程和文章时有点不知所措。并花了几个小时来解决类似的问题,但没有运气解决我自己的问题。我有一个“AddSiteVC”,允许用户添加或删除放入 CoreData 的项目,然后显示在我的“MainVC”上的 TableView 中。我的问题是,当我按保存或删除并返回到我的 MainVC onBtnClick 时,TableView 不会更新,直到我离开 MainVC 然后回来。我不知道我做错了什么,但似乎找不到任何解决这个问题的方法……我不知道我的问题出在哪里,所以我将包括我的大部分 MainVC 代码以供引用。任何帮助将不胜感激!谢谢!
import UIKit
import CoreData
class SitesViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, NSFetchedResultsControllerDelegate {
@IBOutlet weak var tableView: UITableView!
var controller: NSFetchedResultsController<Sites>!
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
attemptFetch()
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "SitesCell", for: indexPath) as! SitesCell
configureCell(cell: cell, indexPath: indexPath as NSIndexPath)
return UITableViewCell()
}
func configureCell(cell: SitesCell, indexPath: NSIndexPath) {
let sites = controller.object(at: indexPath as IndexPath)
cell.configureCell(sites: sites)
cell.accessoryType = .detailButton
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "AddSiteViewController" {
if let destination = segue.destination as? AddSiteViewController {
if let site = sender as? Sites {
destination.siteToEdit = site
}
}
}
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if let sections = controller.sections {
let sectionInfo = sections[section]
return sectionInfo.numberOfObjects
}
return 0
}
func numberOfSections(in tableView: UITableView) -> Int {
if let sections = controller.sections {
return sections.count
}
return 0
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 75
}
func tableView(_ tableView: UITableView, accessoryButtonTappedForRowWith indexPath: IndexPath) {
if let objs = controller.fetchedObjects, objs.count > 0 {
let site = objs[indexPath.row]
performSegue(withIdentifier: "AddSiteViewController", sender: site)
}
}
func attemptFetch() {
let fetchRequest: NSFetchRequest<Sites> = Sites.fetchRequest()
let alphebaticalSort = NSSortDescriptor(key: "name", ascending: true)
fetchRequest.sortDescriptors = [alphebaticalSort]
let controller = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
controller.delegate = self
self.controller = controller
do {
try controller.performFetch()
} catch {
let error = error as NSError
print("\(error)")
}
}
func controllerWillChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
tableView.beginUpdates()
}
func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {
switch (type) {
case.insert:
if let indexPath = newIndexPath {
tableView.insertRows(at: [indexPath], with: .fade)
}
break
case.delete:
if let indexPath = indexPath {
tableView.deleteRows(at: [indexPath], with: .fade)
}
break
case.update:
if let indexPath = indexPath {
let cell = tableView.cellForRow(at: indexPath) as! SitesCell
configureCell(cell: cell, indexPath: indexPath as NSIndexPath)
}
break
case.move:
if let indexPath = indexPath {
tableView.deleteRows(at: [indexPath], with: .fade)
}
if let indexPath = newIndexPath {
tableView.insertRows(at: [indexPath], with: .fade)
}
break
}
}
func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
tableView.endUpdates()
}
}
最佳答案
请对代码进行以下更改。因为 viewDidLoad
会在 viewcontroller 加载的时候被调用。但根据您的要求,您在模态页面中添加了一些内容。所以你需要将代码移动到 viewWillAppear
import UIKit
import CoreData
class SitesViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, NSFetchedResultsControllerDelegate {
@IBOutlet weak var tableView: UITableView!
var controller: NSFetchedResultsController<Sites>!
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
attemptFetch()
}
}
关于ios - swift ,核心数据 : TableView not reloading data when childVC dismissed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40253849/
我有 Storyboard: 如您所见,我有带容器的 MenuViewController : UIViewController。容器是MenuTableViewController : UITabl
最新的 Swift/XCode/iOS。 好的,我正在尝试在容器 View 中更换子 VC。我读过几篇描述如何做到这一点的帖子,它们非常有帮助。但是,我似乎遇到了一个我可以解决的限制问题。 我有一个包
我有一个 tabBar,其中有一个选项卡,其中包含一个 NavVC,该 NavVC 的根作为 ParentVC。 ParentVC 有一个管理两个子VC(RedVC 和BlueVC)的segmente
好吧,我对此是全新的,并且在阅读许多教程和文章时有点不知所措。并花了几个小时来解决类似的问题,但没有运气解决我自己的问题。我有一个“AddSiteVC”,允许用户添加或删除放入 CoreData 的项
我在做一件相当简单的事情时遇到了一些困难,我遗漏了一些东西但没有看到...... 我用一个非常简单的应用程序(使用 IB)重现了这个问题: 应用的主要 ViewController 是一个 UINav
我是一名优秀的程序员,十分优秀!