IOS开发React Native通过Module切换到客户端源码,无法实现ViewController跳转



  • IOS开发React Native通过Module切换到客户端源码,无法实现ViewController跳转,
    代码
    RCT_EXPORT_MODULE();

    RCT_EXPORT_METHOD(addEvent:(NSString *)name location:(NSString *)location)
    {
    NSLog(@"name %@ location %@", name, location);
    TestViewController *TestVC = [[TestViewController alloc] init];
    TestVC.title = @"下一个界面";
    [self.navigationController pushViewController:TestVC animated:YES];

    }

    程序运行执行了该代码,却没有实现页面跳转!App的根视图window的rootViewController时一个UINavigationController,UINavigationController加载ViewController,ViewController代码正常捕获MODULE,也执行了 [self.navigationController pushViewController:TestVC animated:YES]; 但是没有实现页面跳转。



  • 这个倒是没试过,不过我有一次从RN去更改Native的UI的时候,发生更新线程不在主线程的问题,不晓得你是不是这种情况



  • 在代码执跳转前面添加了
    BOOL isMainThread = [NSThread isMainThread];
    NSLog(@"isMainThread = %d",isMainThread);

    看了日志是工作在主线程的,但是就是没有做跳转,另外我通过原生代码在RCTRootView上面添加了Button,点击执行界面跳转是可以了。



  • 同遇到这个问题,通过JS调用OC方法进行页面跳转和背景色更换,进入方法但没有效果

     RCT_EXPORT_MODULE();
    
     RCT_EXPORT_METHOD(addEvent:(NSString *)name location:(NSString *)location)
     {
     NSLog(@"%@,%@",name,location);
    
      [self action];
    }
    
    
    
    
     - (void)action{
    
       NSLog(@"调用成功");   //正常打印
    
       NextViewController* nextVCR = [[NextViewController alloc] init];
    
       __weak MyRNViewController* weakSelf = self;
    
       dispatch_async(dispatch_get_main_queue(), ^{
           MyRNViewController* strongSelf = weakSelf;
           BOOL isMainThread = [NSThread isMainThread];
           NSLog(@"isMainThread = %d",isMainThread);     //isMainThread = 1    在主线程
           NSLog(@"doing");    //正常打印
    
           strongSelf.view.backgroundColor = [UIColor yellowColor];   // 颜色不变更
    
     //    [strongSelf.navigationController pushViewController:nextVCR animated:YES];   页面不跳转
       });
    
     }
    

    同时在UIViewController上放置了一个按钮进行颜色变更,可以成功,请各位大神提示一下这是怎么回事



  • 这里无法跳转的原因是self.navigationController为nil了。

    RCT_EXPORT_MODULE暴露modlue给js之后,会重新创建这个对象,导致其属性都是nil

    目前我发现的解决办法,是使用单例来RCT_EXPORT_MODULE,不过对init方法要重写。这样就不会被重新创建

    不过总感觉怪怪的。。。

    大概是这样
    static RCTGameManager *_instance = nil;
    +(instancetype)sharedInstance
    {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
    _instance = [RCTGameManager new];
    });
    return _instance;
    }

    -(instancetype)init
    {
    if(_instance == nil)
    {
    return [super init];
    }
    return _instance;
    }



  • js 触发本地控制器显示我只试过模态,没有用导航,当时也碰到界面弹不出来的问题,这个时候得获取当前的视图控制器然后用当前的控制器去推才可以,不知道导航是不是这样,还有就是线程问题,react native 有很多的异步操作,如果操作不在主线程也是会有问题的


登录后回复