我在用户打开应用程序(VC1)时使用了一个常见视图。使用Tab Bar控制器,我加载了另一个可用于更新上一张数据可见数据的视图(VC2)。当我返回VC1(堆栈)时,它不会重新加载更新的数据。
我试图在ViewWillAppear中调用ViewDidload,例如...
override func viewWillAppear(_ animated: Bool) {
viewDidLoad()
}
它有效,但是它在仍然在堆栈上的VC1上加载,用户可以看到更改(不好)。
我想解散VC1会有所帮助,但是我还没有找到使用Tab Bar Controller时如何忽略视图。
按照以下步骤处理您的视图安装,每次您的视图出现时:
(VC1 = First View Controller)
- 在VC1中创建一个新函数/方法(名为
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
}
}
您可以使用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()
}