使用标签栏从另一个视图返回时如何重新加载视图控制器
How to reload a view controller when back from another view using tab bar
我有一个用户打开应用程序(VC1)时使用的通用视图。使用选项卡栏控制器,我加载了另一个视图 (VC2),可用于更新前一个视图中可见的数据。当我返回 VC1(堆栈)时,它不会重新加载更新的数据。
我试过像这样调用 viewWillAppear 中的 viewDidLoad...
override func viewWillAppear(_ animated: Bool) {
viewDidLoad()
}
它有效,但它加载了仍在堆栈上的 VC1,用户可以看到变化(不好)。
我想关闭 VC1 会有所帮助,但我还没有找到如何在使用标签栏控制器时关闭视图。
您可以在 VC2 中使用块来回调 VC1 以重新加载某些内容。
首先,在VC2中,声明一个块:
class View2Controller: UIViewController {
public var completionHandler:(()->Void)?
//...
}
其次,返回前在VC2中回调:
self.completionHandler?()
终于,在VC1中,你可以被回调重新加载:
let vc2 = View2Controller()
vc2.completionHandler = { [weak self] () -> Void in
//call reloading method like: self?.reloadData()
}
每次您的视图出现时,请按照以下步骤处理您的视图加载设置:
(VC1 = 第一个视图控制器)
- 在您的 VC1 中创建一个新的 function/method(名为
viewLoadSetup
)并将所有代码从 viewDidLoad()
移动到 viewLoadSetup()
。
现在,从 viewWillAppear
呼叫 viewLoadSetup()
class VC1: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// viewLoadSetup() you may call it from view did load also
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
viewLoadSetup()
}
func viewLoadSetup(){
// setup view did load here
}
}
如果您想从 viewDidLoad
调用 viewLoadSetup
一次,当您的视图控制器加载时,然后在每次从您的 viewWillAppear
调用之后,
class VC1: UIViewController {
var isLoadingViewController = false
override func viewDidLoad() {
super.viewDidLoad()
isLoadingViewController = true
viewLoadSetup()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if isLoadingViewController {
isLoadingViewController = false
} else {
viewLoadSetup()
}
}
func viewLoadSetup(){
// setup view did load here
}
}
我有一个用户打开应用程序(VC1)时使用的通用视图。使用选项卡栏控制器,我加载了另一个视图 (VC2),可用于更新前一个视图中可见的数据。当我返回 VC1(堆栈)时,它不会重新加载更新的数据。
我试过像这样调用 viewWillAppear 中的 viewDidLoad...
override func viewWillAppear(_ animated: Bool) {
viewDidLoad()
}
它有效,但它加载了仍在堆栈上的 VC1,用户可以看到变化(不好)。
我想关闭 VC1 会有所帮助,但我还没有找到如何在使用标签栏控制器时关闭视图。
您可以在 VC2 中使用块来回调 VC1 以重新加载某些内容。
首先,在VC2中,声明一个块:
class View2Controller: UIViewController {
public var completionHandler:(()->Void)?
//...
}
其次,返回前在VC2中回调:
self.completionHandler?()
终于,在VC1中,你可以被回调重新加载:
let vc2 = View2Controller()
vc2.completionHandler = { [weak self] () -> Void in
//call reloading method like: self?.reloadData()
}
每次您的视图出现时,请按照以下步骤处理您的视图加载设置:
(VC1 = 第一个视图控制器)
- 在您的 VC1 中创建一个新的 function/method(名为
viewLoadSetup
)并将所有代码从viewDidLoad()
移动到viewLoadSetup()
。 现在,从
呼叫viewWillAppear
viewLoadSetup()
class VC1: UIViewController { override func viewDidLoad() { super.viewDidLoad() // viewLoadSetup() you may call it from view did load also } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) viewLoadSetup() } func viewLoadSetup(){ // setup view did load here } }
如果您想从 viewDidLoad
调用 viewLoadSetup
一次,当您的视图控制器加载时,然后在每次从您的 viewWillAppear
调用之后,
class VC1: UIViewController {
var isLoadingViewController = false
override func viewDidLoad() {
super.viewDidLoad()
isLoadingViewController = true
viewLoadSetup()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if isLoadingViewController {
isLoadingViewController = false
} else {
viewLoadSetup()
}
}
func viewLoadSetup(){
// setup view did load here
}
}