【问题标题】:How to determine that UIViewController was started for the first time?如何判断 UIViewController 是第一次启动?
【发布时间】:2016-09-13 18:18:35
【问题描述】:

我有一个 ViewControllers 层次结构,以 UINavigationViewController 作为根。
如何确定某个 ViewController 是第一次启动还是由于导航堆栈的展开而启动?

【问题讨论】:

  • 您是说在viewWillAppear 函数中进行检查,以了解它出现是因为这是视图第一次出现还是因为其他视图被关闭?
  • @rmaddy 检查 viewWillAppear 函数是否是第一次出现视图
  • 您的用例是什么?我通常建议您在视图控制器之外管理您的状态,并在 viewWillAppear 中简单地更新它。

标签: ios swift


【解决方案1】:

假设您想知道在第一次显示视图控制器时是否正在调用 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
    }
}

【讨论】:

  • 不适用于 UITabBarController 内的任何视图控制器??‍♂️
  • 这应该反过来
【解决方案2】:

当您在导航堆栈上推送新的视图控制器时,它是第一次实例化,当您将其从堆栈中弹出时,它会被释放或释放。因此,当您推动或前进时,这是第一次,但是当您从以前返回到任何视图控制器时,当前的 vc 已经在内存中,而不是第一次!!!

【讨论】:

  • 如果调用了init方法是不是第一次启动VC?
【解决方案3】:

在 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
    }
}

【讨论】:

  • 虽然此代码可能会解决问题,including an explanation 关于如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的答案以添加解释并说明适用的限制和假设。 From Review
【解决方案4】:

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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    相关资源
    最近更新 更多