React Native iOS Native View使用适当的reactTag发送事件

我有一个iOS本地视图,这是一个UIView与地图视图和UIView。 该地图有一个名为“regionDidChangeAnimated”的事件,我想将事件发送到React Native。 但是reactTag是不正确的。

- (UIView *)view { CGRect screenRect = [[UIScreen mainScreen] bounds]; UIView *frameView = [[UIView alloc] initWithFrame:screenRect]; CGRect frameRect = frameView.bounds; MAMapView *mapView; mapView = [[MAMapView alloc] initWithFrame:frameRect]; self.mapview = mapView; mapView.delegate = self; [frameView addSubview:mapView]; RCTFixedPin* pin = [[RCTFixedPin alloc] initWithFrame:CGRectMake(0, 0, screenRect.size.width, 260)]; pin.userInteractionEnabled = NO; [frameView addSubview:pin]; return frameView; } - (void)mapView:(MAMapView *)mapView regionDidChangeAnimated:(BOOL)animated { if (self.dragging) { self.dragging = NO; } MACoordinateRegion region = mapView.region; NSDictionary *event = @{ ***@"target": ,*** @"region": @{ @"latitude": @(region.center.latitude), @"longitude": @(region.center.longitude), @"latitudeDelta": @(region.span.latitudeDelta), @"longitudeDelta": @(region.span.longitudeDelta), } }; [self.bridge.eventDispatcher sendInputEventWithName:@"topChange" body:event]; } 

如果您查看他们已经实现的本机视图的react-native代码:

https://github.com/facebook/react-native/tree/master/React/Views

它看起来像文件是过时的,而不是使用:

 [self.bridge.eventDispatcher sendInputEventWithName... 

你应该这样做:

 @property (nonatomic, copy) RCTBubblingEventBlock onTopChange; self.onTopChange(@{ @"region": @{ @"latitude": @(region.center.latitude), @"longitude": @(region.center.longitude), @"latitudeDelta": @(region.span.latitudeDelta), @"longitudeDelta": @(region.span.longitudeDelta), } }; 

还有一个RCTDirectEventBlock我不知道它和RCTBubblingEventBlock之间有什么区别

查看RCTComponent.m行160-169,它应该自动处理目标设置:

 // Special case for event handlers __weak RCTViewManager *weakManager = _manager; setterBlock = ^(id target, __unused id source, id json) { __weak id<RCTComponent> weakTarget = target; ((void (*)(id, SEL, id))objc_msgSend)(target, setter, [RCTConvert BOOL:json] ? ^(NSDictionary *body) { body = [NSMutableDictionary dictionaryWithDictionary:body]; ((NSMutableDictionary *)body)[@"target"] = weakTarget.reactTag; [weakManager.bridge.eventDispatcher sendInputEventWithName:RCTNormalizeInputEventName(name) body:body]; } : nil); }; 

同样在经理类,请确保您添加:

 RCT_EXPORT_VIEW_PROPERTY(onTopChange, RCTBubblingEventBlock) 

并且不要忘记在JSX中实际连接事件:

 <MyComponent onTopChange={this.handleOnTopChange}/>