NSGenericException',原因:'只有当源控制器由 UINavigationController 的实例管理时才能使用推送转场

作者:编程家 分类: ios 时间:2025-11-09

使用推送转场的前提条件是源控制器必须由 UINavigationController 的实例管理。否则,在进行推送转场时会出现 NSGenericException 的异常。

推送转场是iOS开发中常用的一种界面跳转方式,它可以实现将一个视图控制器推入导航堆栈,从而实现页面之间的切换。然而,在使用推送转场时,需要注意控制器的管理方式。

推送转场的前提条件

在使用推送转场之前,我们需要确保源控制器由 UINavigationController 的实例管理。这是因为推送转场需要通过导航控制器来管理控制器的堆栈关系。

导航控制器是一种特殊的控制器,它可以管理多个视图控制器,并提供导航栏、工具栏等界面元素。通过导航控制器,我们可以方便地实现页面之间的切换和导航。

如果源控制器不是由导航控制器管理,那么在进行推送转场时就会出现异常。异常的错误信息为 NSGenericException,错误原因为 "只有当源控制器由 UINavigationController 的实例管理时才能使用推送转场"。

案例代码

swift

// 创建源控制器

let sourceViewController = UIViewController()

// 使用推送转场跳转到目标控制器

let destinationViewController = UIViewController()

sourceViewController.navigationController?.pushViewController(destinationViewController, animated: true)

在上述代码中,我们创建了一个源控制器 sourceViewController,并使用推送转场方式跳转到目标控制器 destinationViewController。

在这个例子中,我们没有给源控制器添加导航控制器的管理,因此在进行推送转场时会出现 NSGenericException 异常。

为了解决这个问题,我们需要将源控制器添加到导航控制器中,然后再进行推送转场。

swift

// 创建导航控制器

let navigationController = UINavigationController(rootViewController: sourceViewController)

// 使用导航控制器进行推送转场

let destinationViewController = UIViewController()

navigationController.pushViewController(destinationViewController, animated: true)

在这个修正后的代码中,我们首先创建了一个导航控制器 navigationController,并将源控制器 sourceViewController 设置为其根控制器。然后,我们使用导航控制器进行推送转场,将目标控制器 destinationViewController 推入导航堆栈。

通过以上的修改,我们就可以正常地使用推送转场进行页面跳转了。

在使用推送转场时,需要确保源控制器由 UINavigationController 的实例管理。否则,在进行推送转场时会出现 NSGenericException 异常。为了解决这个问题,我们需要将源控制器添加到导航控制器中,然后再进行推送转场。这样,我们就可以顺利地进行页面跳转了。