繁体   English   中英

如何确定 UIViewController 是第一次启动?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM