【发布时间】:2020-02-19 23:02:27
【问题描述】:
我正在创建一个应用以将 react-native 与现有的 Swift 应用集成。
我研究过类似的问题:
- React-Native: Dismiss/Exit React-Native View back to Native
- How can I go back to native view controller from react-native page?
虽然遵循不同的教程:
- React Native calling class methods on native Swift
- Swift in React Native the ultimate guide
- React Native tutorial integrating in an existing app*
还有官方docs
问题是:所有这些都已过时(但文档)。他们中的大多数使用旧版Navigation 而不是Stack Navigator。其中一个教程(带有星号的教程)展示了如何使用应用程序的 rootTag 将 React Native 应用程序解散回 Native 应用程序,但同样,这是使用旧版 Navigation 完成的。
如果我尝试这样做,我将无法从我的应用中看到 props。
我有一个故事板,里面有一个Button,点击它时会调用这个UIViewController:
按钮控制器
import Foundation
import UIKit
import React
class ButtonController: UIViewController {
@IBOutlet weak var button: UIButton!
@IBAction func buttonClicked(_ sender: Any) {
let data:[String : String] = ["onNavigationStateChange": "{handleNavigationChange}",
"uriPrefix":"/app"];
let rootView = MixerReactModule.sharedInstance.viewForModule("ReactNativeApp", initialProperties: data)
let viewController = UIViewController()
viewController.view = rootView
self.present(viewController, animated: true, completion: nil)
}
}
当我启动应用程序时,我可以看到:
2019-10-23 10:29:30.021 [info][tid:com.facebook.react.JavaScript] Running "ReactNativeApp" with {"rootTag":1,"initialProps":{"uriPrefix":"/app","onNavigationStateChange":"{handleNavigationChange}"}}
但是当我尝试访问 React Native 代码上的 this.props 属性时,我得到了 undefined。
index.js
import HomeScreen from './components/HomeScreen'
import {AppRegistry} from 'react-native';
import {createAppContainer} from 'react-navigation';
import {createStackNavigator} from 'react-navigation-stack';
const MainNavigator = createStackNavigator({
Home: {screen: HomeScreen}
}, {
initialRouteName: 'Home'
})
const NavigationApp = createAppContainer(MainNavigator);
AppRegistry.registerComponent('ReactNativeApp', () => NavigationApp)
console.log("NANANA1", this)
console.log("NANANA2", this.routeName)
console.log("NANANA3", MainNavigator)
console.log("NANANA4", MainNavigator.props)
console.log("NANANA5", NavigationApp)
console.log("NANANA6", NavigationApp.props)
export default NavigationApp
HomeScreen.js
import React from 'react';
import {Text, View, Button, NativeModules} from 'react-native';
var RNBridge = NativeModules.RNBridge;
export default class HomeScreen extends React.Component {
static navigationOptions = {
headerTitle: () => (
<Text>'Welcome'</Text>
),
headerLeft: () => (
<Button title="Dismiss" onPress={() => {
console.log("WOLOLO: ", RNBridge)
console.log("ROGAN: ", this._reactInternalFiber.tag)
RNBridge.dismissPresentedViewController(this._reactInternalFiber.tag)
// RNBridge.dismissPresentedViewController(1)
}}/>
)
};
render() {
console.log('KIKIKI', this._reactInternalFiber.tag)
console.log("MMMMMMM: ", this.props)
return (
<View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
<Text>Home Screen</Text>
</View>
);
}
}
这些是我在 RN 中用来生成视图的 2 个文件。我已经尝试了很多方法来获得rootTag 值,而唯一提供此值的方法是(XCode 上的tag 和rootTag 相同(1))
this._reactInternalFiber.tag
但我不知道如何将这些值发送到我的headerLeft 方法以使用相同的标签,这样当我按下Dismiss 按钮时,它会调用dismissPresentedViewController 的Swift 代码。
我怎样才能有效地解雇我的 VC?或者至少让 rootTag 从 Swift 传递到我的 headerLeft() 方法?
我正在使用这些版本的react-native:
react-native-cli: 2.0.1
react-native: 0.61.2
【问题讨论】:
-
为什么不从 Native Header 本身中解散 RN View Controller?我的意思是,如果它不会改变并从 Swift 文件中清除视图,则在 Native 中渲染标题。
-
你能发布一个你会怎么做的例子吗?我想我有点迷路了
标签: ios swift react-native react-navigation react-navigation-stack