当模态视图(第二个视图)被关闭时刷新 ViewController 中的核心数据 - Swift

Posted

技术标签:

【中文标题】当模态视图(第二个视图)被关闭时刷新 ViewController 中的核心数据 - Swift【英文标题】:Refresh Core Data in ViewController when Modal View (2nd view) is Dismissed - Swift 【发布时间】:2016-03-29 15:29:48 【问题描述】:

我试图弄清楚如何在关闭模态视图后重新加载我的 UIViewController。发生的事情是我从视图 1(我的 UIVIewController)切换到模态视图,在那里我对核心数据进行了更新。完成后,我保存核心数据并关闭模态视图,将用户发送回视图 1(UIViewController)。问题是 UIViewController 没有将更新的更改拉到核心数据(而是呈现旧信息,因为它没有被刷新)。

这是我认为可行的最接近的答案,但我在从 Objective-C 转换为 Swift 时遇到了麻烦。

有什么想法吗?提前感谢您的帮助。

【问题讨论】:

使用 NSFetchedResultsController 来管理核心数据更新,或者如果您使用 NSFetchRequest 来获取 CoreData 实体,在您关闭模式视图后再次执行 FetchRequest 并使用新数据更新您的 ViewController。 我尝试使用 NSFetchedResultsController,但它可以在 UIViewControllers 上使用吗?我知道他们使用 UITableViews 很棒。另外,我知道我需要再次拉/更新 ViewController,这就是我遇到的麻烦(我不知道该怎么做)。 确定你可以在 UIViewController 中使用,看我下面的帖子 【参考方案1】:

这里是快速 NSFetchedResultsController 示例

override func viewDidLoad() 
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

            do 
                try fetchedResultsController.performFetch()
             catch 
                print("An error occurred")
            
    

private lazy var fetchedResultsController: NSFetchedResultsController = 
        let animalsFetchRequest = NSFetchRequest(entityName: "Animal")
        let sortDescriptor = NSSortDescriptor(key: "classification.order", ascending: true)
        animalsFetchRequest.sortDescriptors = [sortDescriptor]

        let frc = NSFetchedResultsController(
            fetchRequest: animalsFetchRequest,
            managedObjectContext: self.context,
            sectionNameKeyPath: nil,
            cacheName: nil)

        frc.delegate = self

        return frc
()

// delegate method

func controllerDidChangeContent(controller: NSFetchedResultsController) 
            // update UI

【讨论】:

这里是新手问题,但是如何从中提取属性?即,使用 NSFetchedResults,我只需执行 FetchResults 并将其保存到 NSManagedObject(从中我可以简单地执行 NSManagedObject.propertyCode 之类的操作来获取值。我会做类似的事情来从 fetchResultController 中提取属性吗? @skind self.fetchResultController.fetchedObject 与您在 executeFetchRequest 时获得的数组相同,但方法 controllerDidChangeContent 说您在 CoreData 更新时,self.fetchResultController.fetchedObject 将拥有新的对象,您所做的所有更改。跨度> 这是一个相当大的问题,但是您在 Swift(我正在使用的语言)中有上述内容吗? @skind 这里是我目前在 google 中找到的,试试看 :) 如果有用别忘了投票 我刚刚更新了我的代码。我的代码稍作修改,但这触及了要点。由于某种原因,视图仍未更新。在 controllerDidChangeContent 函数下,我是否需要再次从 CoreData 调用数据才能更新我的 UI?我试过了,但它似乎没有更新我的 ViewController 上的任何内容。【参考方案2】:

我对此问题的建议是创建将通知视图 1 的委托。

例如:

在呈现的视图控制器中创建委托:

protocol NotifyReloadCoreData
    func notifyDelegate()
end

创建视图控制器的属性:

var delegate: NotifyReloadCoreData?

当按下保存或类似的东西时:

delegate.notifyDelegate()

在您的视图中 1

class UIViewController1: UIViewController, NotifyReloadCoreData

实现功能

func notifyDelegate()
    // reload core data here

【讨论】:

为了让以后的任何人都清楚,我结合了 NickCatib 和 Roman Simenok 的两种解决方案,有效地解决了我的问题。我创建了一个与 Roman 描述的大致相似的 NSFetchedResultsController,但随后我创建了委托以将变量从我的模态视图推回我的第一个 veiwcontroller。然后,我使用 viewDidAppear 函数调用 NSFetchedResultsController 以确保它会根据使用从委托推送的变量驱动的谓词重新查询核心数据。清如泥。但非常感谢尼克和罗曼。

以上是关于当模态视图(第二个视图)被关闭时刷新 ViewController 中的核心数据 - Swift的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI - 如何关闭假的模态视图 - 从里面的第二个视图,用关闭按钮?

关闭模态呈现的视图控制器后切换标签栏控制器视图控制器

模态视图控制器关闭时应用程序崩溃

删除子视图时如何修复触摸禁用?

以编程方式从模态视图控制器切换父选项卡

通过活动 1 时刷新活动 2 中的列表视图