2016-03-16 7 views
5

У меня есть iOS Native View, который является UIView с видом на карту и UIView. На карте есть событие под названием «regionDidChangeAnimated», я хочу отправить событие в React Native. Но responseTag не прав.React Native iOS Native View отправить событие с надлежащим responseTag

- (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]; 
} 

ответ

9

Если вы смотрите в среагировать родной код для родных взглядов, которые они осуществили:

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}/> 
Смежные вопросы