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