2017-07-11 10 views
0

iOS環境で複数のフレームワークを連携させようとしている途中で、ネイティブメソッドを使用してナビゲートしようとしています。 (RN)。iOS Reactネイティブコードを使用してネイティブナビゲーションが動作しない

rootViewControllerを公開し、トリガーされたメソッドでUIViewControllerを変更する複数の方法を試した後、メソッドが呼び出されているにもかかわらず、View Controllerを変更できません。

私は以下で試したコードを残し、私がしようとしていることをうまく説明してくれます。

免責事項:私はOBJ-CとiOSの開発と完全にnoobのと初心者だ - 私は

を行くようにこれは私の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メソッドが呼び出されても何も起こっていません。私の理解から、pushViewControllerUINavigationControllerを使ってビューを変更するときに呼び出すメソッドです。

changeViewと同じコード行を使用してdidFinishLaunchingWithOptionsメソッドでビューコントローラを変更したい場合は、完全に動作します。

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

は、私はその後、約20倍と突然ビューのすべてに悩まさRN]ボタンをクリックして1時間〜20時間を変更するために始めた、問題はさらに奇妙ようにするには。

また、RNボタンを押したときにchangeViewが常に呼び出されることを言及したいと思います。

この件に関するお手伝いをいたします。私はしばらくこのことに執着していました。私は明らかに何かが欠けているかもしれないと確信しています。ありがとう!

答えて

0

私は最後に問題を考え出しました。 ViewControllerを変更するときは、メインスレッドからそうする必要があります。そうしないと、期待通りに機能しません。

私が行うために必要なすべてはOFStarter実装にこのメソッドを追加しました:

- (dispatch_queue_t)methodQueue 
{ 
    return dispatch_get_main_queue(); 
} 
関連する問題