Ios 检测视图控制器何时可见 形势

Ios 检测视图控制器何时可见 形势,ios,swift,uinavigationcontroller,viewcontroller,uinavigationitem,Ios,Swift,Uinavigationcontroller,Viewcontroller,Uinavigationitem,假设在导航控制器中有两个视图控制器。在故事板内部,它们看起来像: NC->VC1->VC2 导航控制器 VC1:视图控制器1 VC2:视图控制器2 因此VC1是导航控制器的根视图控制器,VC1通过显示序列连接到VC2 必须发生的事情: VC1必须在每次打开时调用函数(例如necessaryFunction())。它当前在viewDidLoad()中调用此函数。问题在于,当用户按下VC2中的后退按钮(导航栏上的按钮)并且VC1现在显示时,viewDidLoad()不会被调用。这意味着necessa

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

NC->VC1->VC2

导航控制器

VC1:视图控制器1

VC2:视图控制器2

因此VC1是导航控制器的根视图控制器,VC1通过显示序列连接到VC2

必须发生的事情: VC1必须在每次打开时调用函数(例如
necessaryFunction()
)。它当前在
viewDidLoad()
中调用此函数。问题在于,当用户按下VC2中的后退按钮(导航栏上的按钮)并且VC1现在显示时,
viewDidLoad()
不会被调用。这意味着
necessaryFunction()
也不会被调用

我要找的是: 我正在寻找一种方法,以确保从VC2返回VC1时调用
necessaryFunction()
。我知道这可以通过一名代表来解决,但对于这样一件简单的事情来说,这似乎太复杂了,当然还有其他方法可以做到这一点


也许我可以把
neecessaryfunction()
放进
viewwillispect()
,但我认为这行不通

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

编辑:我找到了这篇文章:,但它是针对objective-C的,不是swift

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

作为子视图控制器出现被取消,或被添加被删除

@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 }
例如,视图控制器可以

检查它是否正在消失,因为它被解雇或在其视图中询问自己是否将消失

方法,通过检查表达式

([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
    }


}

“但我认为这行不通。”你不觉得吗?当您尝试它时发生了什么?当我尝试它时,在
viewdiload()
中调用
neecessaryfunction()
时没有任何变化,但是当您弹出到VC1时调用
viewwillbeen
,为什么这不能解决问题?如果没有,你一定是错误地描述了问题。你表达了两个主要的误解。(1) 视图控制器是UIViewController,因此不可见!(另一方面,UIViews是。)听起来你还没有掌握MVC的一些基础知识。(2) 我看到的下一个更大的误解是关于视图、它们的控制器和它们各自的生命周期。搜索其中一些术语-您应该知道将调用viewWillAppear(),而viewDidLoad()可能不会调用。的可能重复项