关闭模态视图(第二个 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 中的 viewWillAppear() 中显示,但由于我的 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
}
}
试一试,看看是否能解决您的问题。
我有 2 个视图控制器:
VC1 根据 CoreData 属性 isPicked 填充其 tableView,该属性为 bool 并且仅显示具有 true
状态的项目。 VC2 是第二个 Modal(不是全屏)视图控制器,它允许用户更改 isPicked 属性的状态:选中和取消选中项目(使其为真或假)以及在他按下保存按钮之后更改将保存在 CoreData 中,VC2 将被关闭。但是 VC1 不会使用来自 VC2 的最新更改自行更新。
我尝试了什么:
- 加载我的数组以在 VC1 中的 viewWillAppear() 中显示,但由于我的 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
}
}
试一试,看看是否能解决您的问题。