关闭 ViewController2 后,TabBarController 中的 View Controller1 不会自动更新视图
View Controller1 in a TabBarController won't automatically update view after ViewController2 is dismissed
场景
Xcode11.5,Swift5
- 使用核心数据
- 用户想要更新他们的个人资料。用户点击保存后 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
将解决这个问题,而无需进行任何委托。
场景
Xcode11.5,Swift5
- 使用核心数据
- 用户想要更新他们的个人资料。用户点击保存后 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
将解决这个问题,而无需进行任何委托。