【问题标题】:Detecting when a view controller is visible检测视图控制器何时可见
【发布时间】:2017-07-25 01:00:15
【问题描述】:

情况

假设我在导航控制器中有 2 个视图控制器。在故事板中,它们看起来像:

NC -> VC1 -> VC2

NC:导航控制器

VC1:查看控制器一

VC2:视图控制器 2

所以VC1是导航控制器的根视图控制器,VC1通过show segue连接到VC2。

必须发生的事情:

VC1 每次打开时都必须调用一个函数(例如necessaryFunction())。它目前在viewDidLoad() 中调用此函数。问题是当用户按下 VC2 中的后退按钮(导航栏上的那个)并且 VC1 现在显示时,viewDidLoad() 没有被调用。这意味着necessaryFunction()也不会被调用。

我在寻找什么:

我正在寻找一种方法来确保在从 VC2 返回 VC1 时调用 necessaryFunction()。我知道这可以通过委托来解决,但是对于这么简单的事情来说这似乎过于复杂,当然还有另一种方法可以做到这一点。

也许我可以将necessaryFunction() 放入viewWillAppear(),但我认为这行不通。

顺便说一句:我正在用 Swift 编码。

编辑:我找到了这篇文章:iOS how to detect programmatically when top view controller is popped?,但它是用于 Objective-C,而不是 swift。

【问题讨论】:

  • “但我认为这行不通。”你没有?当您尝试时发生了什么?
  • 当我尝试它时,与在 viewDidLoad() 内部调用 necessaryFunction() 时没有任何变化
  • 但是viewWillAppear 在你弹回VC1时调用的,那为什么不能解决问题呢?如果不是,那么您一定是错误地描述了问题。
  • 你表达了两个主要的误解。 (1) View controllers 是 UIViewControllers,因此,可见! (另一方面,UIView 是。)听起来您还没有掌握 MVC 的一些基础知识。 (2) 我看到的下一个 - 也是更大的 - 误解是关于视图、它们的控制器和每个都有的生命周期。搜索其中一些术语 - 您应该知道 viewWillAppear() 将被调用,而 viewDidLoad() 可能不会。

标签: ios swift uinavigationcontroller viewcontroller uinavigationitem


【解决方案1】:

这四个方法可以在视图控制器的外观回调中使用,以确定它是否正在

作为子视图控制器

呈现关闭添加删除 >。

@available(iOS 5.0, *)
open var isBeingPresented: Bool { get }

@available(iOS 5.0, *)
open var isBeingDismissed: Bool { get }


@available(iOS 5.0, *)
open var isMovingToParentViewController: Bool { get }

@available(iOS 5.0, *)
open var isMovingFromParentViewController: Bool { get }

例如,视图控制器可以

通过在 viewWillDisappear 中询问自己,

检查它是否正在消失,因为它被解雇弹出

通过检查表达式的方法

([self isBeingDismissed] || [self isMovingFromParentViewController]).

例如,您可以将方法称为

 override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    if (self.isMovingFromParentViewController())  {
        // we're already on the navigation stack
        // another controller must have been popped off
    }


}

【讨论】:

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