我正在努力让多个框架在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
总是被调用。
对此事我感激不尽。我被困在这一段时间了,我很确定我可能会遗漏一些明显的东西。谢谢!
答案 0 :(得分:0)
我最终弄明白了这个问题。更改ViewController时,您必须从主线程执行此操作,否则它不会按预期工作。
我需要做的就是将此方法添加到OFStarter
实现中:
- (dispatch_queue_t)methodQueue
{
return dispatch_get_main_queue();
}