Swift - 来自appDelegate的pushViewController,rootViewController.navigationController

swift

1个回答

写回答

balbal

2025-08-29 20:35

+ 关注

Swift
Swift

在使用 Swift 开发 IOS 应用时,我们经常会遇到需要进行页面跳转的情况。其中一种常见的方式是通过 pushViewController 方法来实现,但有时我们可能会遇到一个问题:当我们尝试在 AppDelegate 中调用 pushViewController 方法时,rootViewControllernavigationController 属性却是空的。那么,为什么会出现这种情况呢?接下来,我们将探讨这个问题,并提供解决方案。

首先,让我们来看一下 pushViewController 方法的使用方式。这个方法是 UINavigationController 类的一个成员方法,用于将新的视图控制器推入导航栈中。通常情况下,我们会在视图控制器中的某个事件响应方法中调用该方法,以实现页面之间的跳转。但是,当我们尝试在 AppDelegate 中调用该方法时,却发现 rootViewController.navigationController 的值为空。

这个问题的原因是,rootViewController 是应用程序的初始视图控制器,它并不属于导航栈中的任何一个视图控制器。因此,它的 navigationController 属性是空的。要解决这个问题,我们需要找到当前正在显示的视图控制器,然后通过它的 navigationController 属性来调用 pushViewController 方法。

为了找到当前显示的视图控制器,我们可以使用 UIWindowrootViewController 属性。rootViewController 是一个根视图控制器,它负责管理应用程序的整个视图层级结构。通过获取 rootViewController,我们可以获得当前正在显示的视图控制器,并通过它的 navigationController 属性来进行页面跳转。

接下来,让我们来看一个具体的案例代码,来帮助我们更好地理解这个问题和解决方案。

Swift

// 在 AppDelegate 中调用 pushViewController 方法

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

// 创建一个新的视图控制器

let newViewController = NewViewController()

// 获取当前正在显示的视图控制器

if let rootViewController = window?.rootViewController, let currentViewController = rootViewController.presentedViewController {

// 判断当前正在显示的视图控制器是否有导航栏

if let navigationController = currentViewController.navigationController {

// 通过导航栏进行页面跳转

navigationController.pushViewController(newViewController, animated: true)

}

}

return true

}

在上面的代码中,我们创建了一个名为 NewViewController 的新视图控制器。然后,我们通过获取当前正在显示的视图控制器和它的 navigationController 属性,来判断是否可以进行页面跳转。如果当前正在显示的视图控制器有导航栏,我们就可以通过它的 pushViewController 方法来进行页面跳转。

解决方案:AppDelegate 中调用 pushViewController 方法时,rootViewController.navigationController 为空的问题可以通过获取当前正在显示的视图控制器并使用其 navigationController 属性来解决。这样,我们就可以顺利进行页面跳转了。

我们解决了在 AppDelegate 中调用 pushViewController 方法时,rootViewController.navigationController 为空的问题。通过获取当前正在显示的视图控制器并使用其 navigationController 属性,我们可以成功进行页面跳转。希望这篇文章对你在开发 IOS 应用时遇到的类似问题有所帮助。

举报有用(4分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号