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

React Native调用Swift类加载无Storyboard的InitialViewController报错解决

在React Native中通过NativeModules调用Swift类加载纯代码Objective-C控制器的解决方案

你遇到的两个核心问题:一是ChatManager作为普通NSObject子类没有导航控制器的引用,二是你试图从storyboard实例化一个纯代码编写的InitialViewController,这两个点共同导致了报错。下面是一步步的解决方法:

1. 给React Native根控制器添加导航栈

首先修改AppDelegate.m,把原来的根UIViewController用UINavigationController包裹,这样整个应用才有可操作的导航栈:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions];
    RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge moduleName:@"RnBridgeBoldChat" initialProperties:nil];
    rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1];
    
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    // 用导航控制器包裹原根控制器
    UIViewController *rootViewController = [UIViewController new];
    rootViewController.view = rootView;
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:rootViewController];
    self.window.rootViewController = navController;
    
    [self.window makeKeyAndVisible];
    return YES;
}

2. 修正Swift类ChatManager的startChat方法

现在我们可以从应用主窗口获取导航控制器,直接初始化纯代码编写的InitialViewController:

import Foundation
import UIKit

@objc(ChatManager) class ChatManager: NSObject {
    @objc func addEvent(name: String, location: String, date: NSNumber) -> Void {
        // Date is ready to use!
    }
    
    @objc func startChat () {
        // 获取应用主窗口
        guard let mainWindow = UIApplication.shared.windows.first else {
            print("无法获取主窗口")
            return
        }
        // 从根控制器中拿到导航控制器
        guard let navController = mainWindow.rootViewController as? UINavigationController else {
            print("根控制器不是UINavigationController,请检查AppDelegate配置")
            return
        }
        // 直接初始化纯代码的InitialViewController
        let initialVC = InitialViewController()
        // 可按需设置控制器属性,比如标题
        initialVC.title = "Chat Interface"
        // 压入导航栈
        navController.pushViewController(initialVC, animated: true)
    }
}

3. 确保Swift能识别Objective-C的InitialViewController

因为InitialViewController是Objective-C类,需要通过桥接文件让Swift识别它:

  • 若还没有桥接文件,在Xcode中新建一个Objective-C文件,系统会自动提示创建桥接文件,选择确认;
  • 在桥接文件(比如YourProjectName-Bridging-Header.h)中添加:
#import "InitialViewController.h"
  • 检查Xcode项目设置,确保Swift Compiler - General下的Objective-C Bridging Header已指向该桥接文件的路径。

4. 注册NativeModule到React Native

创建一个Objective-C文件(比如ChatManager.m)来注册ChatManager,让React Native能通过NativeModules访问它:

#import <React/RCTBridgeModule.h>

@interface RCT_EXTERN_MODULE(ChatManager, NSObject)

// 注册addEvent方法
RCT_EXTERN_METHOD(addEvent:(NSString *)name location:(NSString *)location date:(NSNumber *)date)
// 注册startChat方法
RCT_EXTERN_METHOD(startChat)

@end

完成以上修改后,你在React Native代码里调用NativeModules.ChatManager.startChat()就能正常push出InitialViewController了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:11:31