5

Integruję komponenty w istniejącej aplikacji na iOS napisanej w Objective-C/Swift.React-Native Hybrid App: Pop UIViewController, który osadza RCTRootView

Jako administrator widoku aplikacji mojej aplikacji używam UINavigationController.

W jednej z wielu kontrolerów widoku mojej aplikacji, mam przycisk, który pchania rzutem Controller w kontroler nawigacyjny, który zawiera następujący kod:

@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 zwraca Navigator że zarządzanie wieloma React- Składniki macierzyste:

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} 
     /> 
    } 
    /> 
); 

Ten przepływ pracy działa dobrze. Jedyne, czego potrzebuję, to sposób na pobicie ReactNativeViewController z mojego UINavigationController po naciśnięciu przycisku Back na głównym komponencie React-Native.

Próbowałem następujących ale bez powodzenia:

  • Tworzenie Native moduł z jednej metody popLastViewController że pop wyświetlany UIViewController, który jest wyświetlany z UINavigationController:

    @implementation RNNavigationControllerBridge 
    
    RCT_EXPORT_MODULE() 
    
    RCT_EXPORT_METHOD(popLastViewController) { 
        UINavigationController *navigationController = (UINavigationController *)[[[[UIApplication sharedApplication] delegate] window] rootViewController]; 
    
        [navigationController popViewControllerAnimated:NO]; 
    } 
    
    @end 
    
  • połączeń powyższa metoda po naciśnięciu przycisku Wstecz:

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

Ale to nie działa.

Jakieś sugestie?

+0

Witam, twoje ustawienie tutaj widoku głównego jest takie samo w appdelegate lub innym katalogu głównym? – Ramakrishna

+0

Ten z appdelegate –

+0

Chcę wiedzieć jaka jest różnica między ustawieniem widoku głównego w delegacie aplikacji iw tym kontrolerem widoku? W jaki sposób będzie użyteczne, jeśli ustawimy widok główny w widoku kontrolera? Plz, pomóżcie mi w tym ... – Ramakrishna

Odpowiedz

7

Problem rozwiązany!

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

    [navigationController popViewControllerAnimated:YES]; 
    }); 
} 
Powiązane problemy