iOS React Native - 导航无法使用本机代码

时间:2017-07-11 16:52:02

标签: ios objective-c react-native

我正在努力让多个框架在iOS环境中协同工作,并且在尝试使用由React Native(RN)触发的本机方法进行导航时遇到困难。

尝试多种方法(其中一种方式是暴露rootViewController并更改触发方法中的UIViewController)后,我无法更改视图控制器,即使正在调用方法。

我会留下一些我在下面尝试的代码,希望能更好地解释我尝试做的事情。

免责声明:我是obj-c的初学者和iOS开发的完整菜鸟 - 我去学习

这是我的AppDelegate实施:

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  [super applicationDidFinishLaunching:application];  

  NSURL *jsCodeLocation;

  jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index.ios" fallbackResource:nil];

  RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
                                                      moduleName:@"SomethingMobile"
                                               initialProperties:nil
                                                   launchOptions:launchOptions];
  rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1];

  UIViewController *rootViewController = [[UIViewController alloc] init];
  rootViewController.view = rootView;


  self.navigationController = [[UINavigationController alloc] initWithRootViewController:   rootViewController];
  [self.window setRootViewController:self.navigationController];

//--- style the UINavigationController
  self.navigationController.navigationBar.barStyle = UIBarStyleBlackTranslucent;
  self.navigationController.navigationBar.topItem.title = @"Home";

  return YES;
}

-(void) changeView {
 // SimpleViewController is a valid UIViewController that I tested separately and it works
  [self.navigationController pushViewController:[[SimpleViewController alloc] init] animated:YES];
  self.navigationController.navigationBar.topItem.title = @"OF";
  printf("Got here");
}

@end

然后我有一个类充当RN和本机代码之间的桥梁:

@implementation OFStarter

// The React Native bridge needs to know our module
RCT_EXPORT_MODULE()

- (NSDictionary *)constantsToExport {
  return @{@"greeting": @"Welcome to native"};
}

RCT_EXPORT_METHOD(squareMe:(int)number:(RCTResponseSenderBlock)callback) {

  AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
  [delegate changeView]; // this is getting called when I press a button in the RN view
  callback(@[[NSNull null], [NSNumber numberWithInt:(number*number)]]);
}

@end

现在由于某些我不知道的原因,当调用changeView方法时,没有任何事情发生。根据我的理解,pushViewController是使用UINavigationController更改视图时要调用的方法。

现在,如果我想使用与didFinishLaunchingWithOptions中相同的代码行更改changeView方法中的视图控制器,它可以完美地运行。

[self.navigationController pushViewController:[[SimpleViewController alloc] init] animated:YES];

为了让事情变得更加奇怪,有一次我点击了RN按钮,烦恼了大约20次,然后突然间视线开始变化~20次。

另外,我想提一下,当我按下RN按钮时,changeView总是被调用。

对此事我感激不尽。我被困在这一段时间了,我很确定我可能会遗漏一些明显的东西。谢谢!

1 个答案:

答案 0 :(得分:0)

我最终弄明白了这个问题。更改ViewController时,您必须从主线程执行此操作,否则它不会按预期工作。

我需要做的就是将此方法添加到OFStarter实现中:

- (dispatch_queue_t)methodQueue
{
  return dispatch_get_main_queue();
}