You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native iOS真机抛出“Application tried to present modally...”异常

iOS真机模态视图控制器异常排查方案

问题概述

模拟器运行正常,真机启动时在UIApplicationMain方法抛出异常,异常信息:

Application tried to present modally a view controller <UIViewController: 0x10785cb20> that is already being presented by <UIViewController: 0x107e07440>

注:提供的main.m仅为应用入口代码,异常根源不在该文件,需从应用启动流程的视图控制器跳转逻辑入手排查。

核心原因

异常本质是同一视图控制器被重复发起模态present操作,或当前已有未完成的模态present流程时,又触发了新的present请求。真机与模拟器的运行时序、线程调度存在差异,导致模拟器未触发冲突,真机暴露问题。

排查与解决步骤

  • 检查启动流程中的present逻辑
    重点排查AppDelegate的didFinishLaunchingWithOptions、根控制器的viewDidLoad/viewWillAppear/viewDidAppear方法:
    1. 确认是否存在重复调用presentViewController:animated:completion:的情况
    2. 避免在viewDidLoad中执行present操作——此时视图未完成加载,真机易出现时序冲突,建议移至viewDidAppear:中执行
  • 添加present前的安全校验
    执行present操作前,先判断当前控制器的present状态,避免冲突:
    // 安全present示例
    if (!self.presentedViewController && !targetVC.isBeingPresented) {
        [self presentViewController:targetVC animated:YES completion:nil];
    }
    
  • 排查异步操作导致的重复触发
    若present逻辑由异步回调(如网络请求、通知)触发,需添加标记位防止重复执行:
    @property (nonatomic, assign) BOOL isPresenting;
    
    // 异步回调内的处理
    if (!self.isPresenting) {
        self.isPresenting = YES;
        [self presentViewController:targetVC animated:YES completion:^{
            self.isPresenting = NO;
        }];
    }
    
  • 检查Storyboard/Scene配置
    若使用Storyboard,确认是否存在多个Segue同时触发模态跳转,或初始控制器的跳转配置有误。

调试提示

真机线程调度更严格,建议开启Xcode的主线程检查器(Main Thread Checker),快速定位UI操作的线程问题。

内容的提问来源于stack exchange,提问作者Abhigyan Gaurav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 07:03:27