2016-03-16 23 views
5

Tôi có Chế độ xem bản địa iOS là chế độ xem UIView với chế độ xem bản đồ và UIView. Bản đồ có một sự kiện được gọi là 'regionDidChangeAnimated', tôi muốn gửi sự kiện đến React Native. Nhưng reactTag không đúng.Phản hồi sự kiện Native Native bản địa iOS gửi phản hồi đúng cáchTag

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

Trả lời

9

Nếu bạn nhìn vào mã phản ứng bản địa cho các quan điểm tự nhiên họ đã thực hiện:

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

nó trông giống như các tài liệu hướng dẫn là lỗi thời và thay vì sử dụng:

[self.bridge.eventDispatcher sendInputEventWithName... 

Bạn nên làm như sau:

@property (nonatomic, copy) RCTBubblingEventBlock onTopChange; 

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

Ngoài ra còn có một RCTDirectEventBlock Tôi không chắc chắn những gì khác biệt là giữa đó và RCTBubblingEventBlock

Nhìn trong RCTComponent.m dòng 160-169 nó nên xử lý mục tiêu thiết lập cho bạn tự động:

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

Cũng trong lớp Người quản lý đảm bảo bạn thêm:

RCT_EXPORT_VIEW_PROPERTY(onTopChange, RCTBubblingEventBlock) 

Và đừng quên thực sự kết nối sự kiện trong JSX của bạn:

<MyComponent onTopChange={this.handleOnTopChange}/> 
Các vấn đề liên quan