关闭 ViewController2 后,TabBarController 中的 View Controller1 不会自动更新视图

View Controller1 in a TabBarController won't automatically update view after ViewController2 is dismissed

场景

Xcode11.5,Swift5

  1. 使用核心数据
  2. 用户想要更新他们的个人资料。用户点击保存后 VC2 被关闭。以黄色突出显示的 VC1 区域应反映更改。

问题

数据保存正确。但是,以黄色突出显示的 VC1 元素不会自动更新。如果我转到另一个选项卡然后返回,视图元素会随着更新后的更改而刷新。

我的代码

我有一个 setupUI() 布局元素的方法,并尝试将它添加到 VC1 的 viewWillAppear 方法,但没有成功。

   //VC1:

   override func viewDidLoad() {
    super.viewDidLoad()
    fetchUser()
    setupUI()
    
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(true)
    
    setupUI()   
}

viewWillAppear 当您关闭填充您需要使用委托的数据的模态时,不会调用

1-当你显示模态时vc

let vc = SomeVC()
vc.delegate = self // declare property delegate inside the modal of that type / protocol 
// present

2- 当你关闭模态

self.delegate?.setupUI()
// dimiss

您可以使用委托方法在 VC1 中执行一些更改以响应 VC2 中的某些操作。在这种情况下,您将在 VC1 中设置委托并在 VC2 中调用委托方法。进行此调用的理想位置是在 dismiss 的完成块中。

//VC1
public protocol MyProtocol: class {
    func delegateMethod()
}

在 viewDidLoad 方法中设置 VC2 的委托

override func viewDidLoad() {
    super.viewDidLoad()
    fetchUser()
    setupUI()
    //VC2 is the instance of view controller you are going to push from this page
    VC2.delegate = self
}

确保 VC1 确认 MyProtocol 协议

extension VC1: MyProtocol {
    func delegateMethod() {
        // reload view here
    }
}

在 VC2 中声明委托

//VC2
var delegate: MyProtocol?    

然后调用delegate方法完成dismiss

self.dismiss(animated: false, completion: {
    self.delegate?.delegateMethod()
})

或者,您也可以使用观察者来响应任何更改,但这可能有点矫枉过正。查看 this 文章,他们详细讨论了整个事情。

设置vc2.modalPresentationStyle = .fullScreen将解决这个问题,而无需进行任何委托。