[英]How to determine that UIViewController was started for the first time?
我有一个 ViewControllers 层次结构,以 UINavigationViewController 作为根。
如何确定某个 ViewController 是第一次启动还是由于导航堆栈展开而启动?
假设您想知道viewWillAppear:
(或viewDidAppear:
)是否在视图控制器第一次显示时被调用,或者是否因为另一个视图控制器已被解除而被显示,您可以轻松地执行以下操作:
较新的 Swift 版本:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if isBeingPresented || isMovingToParent {
// This is the first time this instance of the view controller will appear
} else {
// This controller is appearing because another was just dismissed
}
}
较旧的 Swift 版本:
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
if isBeingPresented() || isMovingToParentViewController() {
// This is the first time this instance of the view controller will appear
} else {
// This controller is appearing because another was just dismissed
}
}
当您在导航堆栈上推送新的视图控制器时,它是第一次实例化,当您从堆栈中弹出它时,它会被释放或释放。 因此,当您推动或前进时,这是第一次,但是当您从前一个返回到任何视图控制器时,当前 vc 已经在内存中,而不是第一次!!!
在 Objective-C 上,它看起来像:
-(void) viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
if ([self isBeingPresented] || [self isMovingToParentViewController]) {
// This is the first time
} else {
// This is the NOT first time
}
}
isBeingPresented 和 isMovingToParent 是一个棘手的问题。
我的方法是创建一个计数器并在 viewWillAppear 中增加它。
var viewWillAppearCounter = 0
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if viewWillAppearCounter == 0 {
print("viewWillAppear will be executed for the first time")
} else {
print("viewWillAppear was already executed \(viewWillAppearCounter) times")
}
viewWillAppearCounter += 1
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.