5

Ich integriere Komponenten in eine bestehende iOS App, die in Objective-C/Swift geschrieben wurde.React-Native Hybrid-App: Pop UIViewController, der RCTRootView einbettet

Als Root-View-Controller meiner App verwende ich eine UINavigationController.

In einer der mehreren View-Controller meiner app, habe ich eine Schaltfläche, die eine View-Controller in der Navigation Controller drücken, das den folgenden Code enthält:

@objc class ReactNativeViewController: UIViewController { 
    override func viewDidLoad() { 
    let jsCodeLocation = NSURL(string: "http://localhost:8081/index.ios.bundle?platform=ios&dev=true") 

    let contactsView = RCTRootView(bundleURL: jsCodeLocation, moduleName: "MainComponent", initialProperties: nil, launchOptions: nil) 

    self.view.addSubview(contactsView) 
    contactsView.frame = self.view.bounds; 
    } 
} 

MainComponent gibt eine Navigator, die mehrere lauten die Reaktionen verwalten Native Komponenten:

return (
    <Navigator 
    initialRoute={initialRoute} 
    renderScene={(route, navigator) => { 
     if (route.component) { 
     return <route.component navigator={navigator} {...route.passProps} />; 
     } 
    }} 
    navigationBar={ 
     <Navigator.NavigationBar 
     routeMapper={this.NavigationBarRouteMapper} 
     style={styles.navBar} 
     /> 
    } 
    /> 
); 

Dieser Workflow funktioniert einwandfrei. Die einzige Sache, die ich brauche, ist eine Möglichkeit, ReactNativeViewController von meinem UINavigationController zu knallen, wenn der Knopf Back auf die react-native Hauptkomponente getroffen wurde.

habe ich versucht, die folgend, aber ohne Glück:

  • Eine Native Module erstellen mit einer einzigen Methode popLastViewController, die die angezeigten UIViewController Pop, das von den UINavigationController angezeigt:

    @implementation RNNavigationControllerBridge 
    
    RCT_EXPORT_MODULE() 
    
    RCT_EXPORT_METHOD(popLastViewController) { 
        UINavigationController *navigationController = (UINavigationController *)[[[[UIApplication sharedApplication] delegate] window] rootViewController]; 
    
        [navigationController popViewControllerAnimated:NO]; 
    } 
    
    @end 
    
  • Anruf Die obige Methode, wenn die Zurück-Taste gedrückt wurde:

    onPress={() => { 
        if (index === 0) { 
        NativeViewsManager.popLastViewController(); 
        } else { 
        navigator.pop(); 
        } 
    }} 
    

Aber das funktioniert nicht.

Irgendwelche Vorschläge?

+0

Hallo, setzen Sie hier die root-Ansicht wie im Appdelegate oder einem anderen root? – Ramakrishna

+0

Die aus dem Appdelegate –

+0

Ich möchte wissen, was ist der Unterschied zwischen der Einstellung der Stammansicht in der App-Delegate und in dieser Ansicht Controller? Wie wird es nützlich sein, wenn wir die Root-Ansicht im View-Controller festlegen? Plz, hilf mir dabei ... – Ramakrishna

Antwort

7

Problem gelöst!

RCT_EXPORT_METHOD(popLastViewController) { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
    UINavigationController *navigationController = (UINavigationController *)[[[[UIApplication sharedApplication] delegate] window] rootViewController]; 

    [navigationController popViewControllerAnimated:YES]; 
    }); 
}