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

Refresh Core Data in ViewController when Modal View (2nd VC) is Dismissed

我有 2 个视图控制器:

VC1 根据 CoreData 属性 isPicked 填充其 tableView,该属性为 bool 并且仅显示具有 true 状态的项目。 VC2 是第二个 Modal(不是全屏)视图控制器,它允许用户更改 isPicked 属性的状态:选中和取消选中项目(使其为真或假)以及在他按下保存按钮之后更改将保存在 CoreData 中,VC2 将被关闭。但是 VC1 不会使用来自 VC2 的最新更改自行更新。

我尝试了什么:

我的 VC1:

    override func viewDidLoad() {
    super.viewDidLoad()
    let predicate = NSPredicate(format: "isPicked == YES")
    converterArray = load(for: tableView, and: predicate)
}

func load(for tableView: UITableView, with request: NSFetchRequest<Currency> = Currency.fetchRequest(), and predicate: NSPredicate? = nil, sortDescriptor: [NSSortDescriptor] = [NSSortDescriptor(key: "shortName", ascending: true)]) -> [Currency] {
    var array = [Currency]()
    request.predicate = predicate
    request.sortDescriptors = sortDescriptor
    do {
        array = try context.fetch(request)
    } catch {
        print(error)
    }
    DispatchQueue.main.async {
        tableView.reloadData()
    }
    return array
}

我的VC2:

    @IBAction func saveButtonPressed(_ sender: UIBarButtonItem) {
    do {
        try context.save()
    } catch {
        print(error)
    }
    dismiss(animated: true)
}

另请看一个简短的 GIF,我在其中展示了发生的情况:CLICK

不知道VC2解雇后如何自动更新VC1中的变化...

我假设数据在 VC2 中正确保存,您遇到的唯一问题是在 VC1 中重新加载数据的正确方法。

使 VC1 符合 UIViewControllerTransitioningDelegate 并实现其委托函数 animationController(forDismissed dismissed: UIViewController) 可能会解决您的问题

阅读更多here

试试这个

// Some function in VC1 which loads VC2
func loadVC2()
{
    let newVC = UIViewController()
    
    // This is important
    newVC.transitioningDelegate = self
    
    present(newVC, animated: true, completion: nil)
}

然后在VC1中,实现函数animationController(forDismissed dismissed: UIViewController)

extension VC1: UIViewControllerTransitioningDelegate
{
    // UIViewControllerTransitioningDelegate delegate function auto invoked during modal transitions
    func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning?
    {
        print("returned back")
        
        // reload your table in VC1 here
        
        /// Returning nil as per guidelines
        return nil
    }
}

试一试,看看是否能解决您的问题。