首页 > 解决方案 > 关闭顶层 VC 时不调用 ViewWillAppear

问题描述

正如我在标题中所写,我不确定为什么在解雇另一个 VC 时不调用 ViewWillAppear。我认为我的项目有点棘手,所以我将解释我的项目中发生了什么。

在此处输入图像描述

大多数情况下,我在代码中配置 UI。我有两个 VC,ListVC 和 CameraVC,我在 ListVC 中有一个标签栏和一个导航变量,我在代码中配置了所有这些。所以在 SceneDelegate 我写了类似的东西

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    guard let scene = (scene as? UIWindowScene) else { return }
    window = UIWindow(frame: scene.coordinateSpace.bounds)
    window?.windowScene = scene
    window?.rootViewController = createTabBar()
    window?.makeKeyAndVisible()
}

func createTabBar() -> CustomTabBarController {
    let tabbar = CustomTabBarController()
    tabbar.viewControllers = tabbar.setUpTabbarItems()
    return tabbar
}

在 CustomTabBarController 类中,因为我只想显示事件列表,所以我添加了

func createListNC() -> UINavigationController {
    let ListVC = ListViewController()
    ListVC.tabBarItem = UITabBarItem(title: "", image: UIImage(named: "add-icon"), tag: 0)
    return UINavigationController(rootViewController: ListVC)
}


func setUpTabbarItems() -> [UIViewController]{
    return [createListNC()]
}

所以现在我可以在应用程序的主页上显示 List VC。但是,我在情节提要中制作了 CameraVC,当用户点击 List VC 中的一个 Event 单元格并显示 CamearaVC 时,我添加了以下代码。

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    let storyboard = UIStoryboard(name: "Camera", bundle: nil)
    let CameraVC = storyboard.instantiateViewController(identifier: "Camera")
    self.present(CameraVC, animated: true, completion: nil)
}

所以我也可以展示 ListVC 中的 CameraVC。

但是当我想从 CameraVC 回到 ListVC 时,就会出现问题。我将 IBAction 添加到 CameraVC 中的“< back”按钮,我可以关闭 CameraVC,但是,由于 cameraVC 的屏幕是水平的,因此 ListVC 也与水平堆叠,我想让 ListVC 垂直。

@IBAction func unwindToLiveList (_ segue: UIStoryboardSegue) {
    self.presentingViewController?.dismiss(animated: true, completion: nil)
}

因此,我打算编写一个代码,用于在用户从 CameraVC 回到 ListVC 时修复应用程序的方向。

我只是想知道我应该把修复方向代码放在哪里,所以我向 ListVC 添加了 viewwillappear 和一些打印语句,但是当从 CameraVC 回到 ListVC 时,它们都没有被调用。我还在 CustomTabBarController 类中编写了相同的代码,但它从未被调用...

所以,我想知道当用户从 CameraVC 回到 ListVC 时,我可以在哪里和哪个文件编写代码来修复要触发的方向。另外,如果有人能解释为什么会这样,请告诉我。

标签: iosswiftlifecycleviewwillappear

解决方案


原因在于他们在 iOS13(或 14)中所做的更改。在默认的模态呈现模式(似乎您正在呈现模态)是全屏之前,现在它们在当前上下文中呈现而不会使呈现视图控制器消失,这就是为什么willAppear不调用它,它已经存在。
如果要更改该行为,可以将不同的演示样式设置为.fullScreen.


推荐阅读