React-Native:无法触发Native UIButton触摸事件

时间:2017-08-20 16:10:37

标签: ios swift react-native

我将原生的Swift模块桥接到React Native。我创建了一个UIView,它会在其上创建一个带有目标处理程序的UIButton。它会正确呈现所有内容,但是单击按钮不会触发任何内容。我在这里举办了一个演示:https://github.com/esbenp/react-native-swift-test

我的原生模块非常简单:https://github.com/esbenp/react-native-swift-test/blob/master/ios/TestModule.swift

let Button = UIButton(frame: CGRect(x: 0, y: 0, width: 200, height: 50))
Button.setTitleColor(UIColor.blue, for: .normal)
Button.setTitle("Press me", for: .normal)
Button.addTarget(self, action: #selector(TestModule.onClick), for: .touchUpInside)

self.addSubview(Button)

我使用经理桥接它:https://github.com/esbenp/react-native-swift-test/blob/master/ios/TestModuleManager.m

#import <React/RCTViewManager.h>
#import "ReactNativeSwiftTest-Swift.h"

@interface TestModuleManager : RCTViewManager
@end

@implementation TestModuleManager

RCT_EXPORT_MODULE()

- (UIView *)view
{
  return [[Parent alloc] init];
}

@end

然后在JS中运行它:https://github.com/esbenp/react-native-swift-test/blob/master/index.ios.js

我不是iOS专家,但它似乎与框架有关。如果我使用相同的本机模块并在正常的iOS项目UIViewController中使用它,如下所示:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    let Button = TestModule(frame: CGRect(x: 0, y: 0, width: 500, height: 500))

    self.view.addSubview(Button)
}

有效。我假设这是因为React Native创建的框架是width=0height=0(至少如果我NSLog(String(describing: frame.size.height)),它就是这样说的。)

iOS MapView example指定不覆盖框架,因为React Native将设置此框架。我不知道框架是错误的还是我错过了其他一些背景?我尝试按照#2948#15097的说明进行操作,但没有任何帮助。

1 个答案:

答案 0 :(得分:0)

我在这里发现了错误。事实证明,您必须将flex: 1添加到JS端的实际本机组件,以使框架正确填充。

<强>之前

export default class ReactNativeSwiftTest extends Component {
  render() {
    return (
      <View style={styles.container}>
        <Test />
      </View>
    );
  }
}

<强>后

export default class ReactNativeSwiftTest extends Component {
  render() {
    return (
      <View style={styles.container}>
        <Test style={{flex: 1}} />
      </View>
    );
  }
}