Skip to content

Commit 6eeb9e6

Browse files
authored
fix(ios): use RNMBXViewResolver for native module view lookups (#4099)
Use polling-based view resolution instead of immediate lookup to fix "Unknown reactTag" errors when calling native methods immediately after receiving a ref callback.
1 parent b493975 commit 6eeb9e6

10 files changed

+55
-90
lines changed

ios/RNMBX/RNMBXCameraModule.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#import <Foundation/Foundation.h>
22
#import <UIKit/UIKit.h>
3+
#import "RNMBXViewResolver.h"
34

45
#ifdef RCT_NEW_ARCH_ENABLED
56
#import "rnmapbox_maps_specs.h"
@@ -9,9 +10,9 @@
910

1011
@interface RNMBXCameraModule : NSObject
1112
#ifdef RCT_NEW_ARCH_ENABLED
12-
<NativeRNMBXCameraModuleSpec>
13+
<NativeRNMBXCameraModuleSpec, RNMBXViewResolverDelegate>
1314
#else
14-
<RCTBridgeModule>
15+
<RCTBridgeModule, RNMBXViewResolverDelegate>
1516
#endif
1617

1718
@end

ios/RNMBX/RNMBXCameraModule.mm

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -36,22 +36,14 @@ - (dispatch_queue_t)methodQueue
3636

3737
- (void)withCamera:(nonnull NSNumber*)viewRef block:(void (^)(RNMBXCamera *))block reject:(RCTPromiseRejectBlock)reject methodName:(NSString *)methodName
3838
{
39-
#ifdef RCT_NEW_ARCH_ENABLED
40-
[self.viewRegistry_DEPRECATED addUIBlock:^(RCTViewRegistry *viewRegistry) {
41-
RNMBXCameraComponentView *componentView = [self.viewRegistry_DEPRECATED viewForReactTag:viewRef];
42-
RNMBXCamera *view = componentView.contentView;
43-
44-
#else
45-
[self.bridge.uiManager
46-
addUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *, UIView *> *viewRegistry) {
47-
RNMBXCamera *view = [uiManager viewForReactTag:viewRef];
48-
#endif // RCT_NEW_ARCH_ENABLED
49-
if (view != nil) {
50-
block(view);
51-
} else {
52-
reject(methodName, [NSString stringWithFormat:@"Unknown reactTag: %@", viewRef], nil);
53-
}
54-
}];
39+
[RNMBXViewResolver withViewRef:viewRef
40+
delegate:self
41+
expectedClass:[RNMBXCamera class]
42+
block:^(UIView *view) {
43+
block((RNMBXCamera *)view);
44+
}
45+
reject:reject
46+
methodName:methodName];
5547
}
5648

5749
RCT_EXPORT_METHOD(updateCameraStop:(nonnull NSNumber *)viewRef

ios/RNMBX/RNMBXImageModule.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#import <Foundation/Foundation.h>
22
#import <UIKit/UIKit.h>
3+
#import "RNMBXViewResolver.h"
34

45
#ifdef RCT_NEW_ARCH_ENABLED
56
#import "rnmapbox_maps_specs.h"
@@ -9,9 +10,9 @@
910

1011
@interface RNMBXImageModule : NSObject
1112
#ifdef RCT_NEW_ARCH_ENABLED
12-
<NativeRNMBXImageModuleSpec>
13+
<NativeRNMBXImageModuleSpec, RNMBXViewResolverDelegate>
1314
#else
14-
<RCTBridgeModule>
15+
<RCTBridgeModule, RNMBXViewResolverDelegate>
1516
#endif
1617

1718
@end

ios/RNMBX/RNMBXImageModule.mm

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -27,22 +27,14 @@ - (dispatch_queue_t)methodQueue
2727

2828
- (void)withImage:(nonnull NSNumber*)viewRef block:(void (^)(RNMBXImage *))block reject:(RCTPromiseRejectBlock)reject methodName:(NSString *)methodName
2929
{
30-
#ifdef RCT_NEW_ARCH_ENABLED
31-
[self.viewRegistry_DEPRECATED addUIBlock:^(RCTViewRegistry *viewRegistry) {
32-
RNMBXImageComponentView *componentView = [self.viewRegistry_DEPRECATED viewForReactTag:viewRef];
33-
RNMBXImage *view = componentView.contentView;
34-
35-
#else
36-
[self.bridge.uiManager
37-
addUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *, UIView *> *viewRegistry) {
38-
RNMBXImage *view = [uiManager viewForReactTag:viewRef];
39-
#endif // RCT_NEW_ARCH_ENABLED
40-
if (view != nil) {
41-
block(view);
42-
} else {
43-
reject(methodName, [NSString stringWithFormat:@"Unknown reactTag: %@", viewRef], nil);
44-
}
45-
}];
30+
[RNMBXViewResolver withViewRef:viewRef
31+
delegate:self
32+
expectedClass:[RNMBXImage class]
33+
block:^(UIView *view) {
34+
block((RNMBXImage *)view);
35+
}
36+
reject:reject
37+
methodName:methodName];
4638
}
4739

4840

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#import <Foundation/Foundation.h>
22
#import <UIKit/UIKit.h>
3+
#import "RNMBXViewResolver.h"
34

45
#ifdef RCT_NEW_ARCH_ENABLED
56
#import "rnmapbox_maps_specs.h"
@@ -9,9 +10,9 @@
910

1011
@interface RNMBXPointAnnotationModule : NSObject
1112
#ifdef RCT_NEW_ARCH_ENABLED
12-
<NativeRNMBXPointAnnotationModuleSpec>
13+
<NativeRNMBXPointAnnotationModuleSpec, RNMBXViewResolverDelegate>
1314
#else
14-
<RCTBridgeModule>
15+
<RCTBridgeModule, RNMBXViewResolverDelegate>
1516
#endif
1617

1718
@end

ios/RNMBX/RNMBXPointAnnotationModule.mm

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -27,22 +27,14 @@ - (dispatch_queue_t)methodQueue
2727

2828
- (void)withPointAnnotation:(nonnull NSNumber*)viewRef block:(void (^)(RNMBXPointAnnotation *))block reject:(RCTPromiseRejectBlock)reject methodName:(NSString *)methodName
2929
{
30-
#ifdef RCT_NEW_ARCH_ENABLED
31-
[self.viewRegistry_DEPRECATED addUIBlock:^(RCTViewRegistry *viewRegistry) {
32-
RNMBXPointAnnotationComponentView *componentView = [self.viewRegistry_DEPRECATED viewForReactTag:viewRef];
33-
RNMBXPointAnnotation *view = componentView.contentView;
34-
35-
#else
36-
[self.bridge.uiManager
37-
addUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *, UIView *> *viewRegistry) {
38-
RNMBXPointAnnotation *view = [uiManager viewForReactTag:viewRef];
39-
#endif // RCT_NEW_ARCH_ENABLED
40-
if (view != nil) {
41-
block(view);
42-
} else {
43-
reject(methodName, [NSString stringWithFormat:@"Unknown reactTag: %@", viewRef], nil);
44-
}
45-
}];
30+
[RNMBXViewResolver withViewRef:viewRef
31+
delegate:self
32+
expectedClass:[RNMBXPointAnnotation class]
33+
block:^(UIView *view) {
34+
block((RNMBXPointAnnotation *)view);
35+
}
36+
reject:reject
37+
methodName:methodName];
4638
}
4739

4840

ios/RNMBX/RNMBXShapeSourceModule.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#import <Foundation/Foundation.h>
22
#import <UIKit/UIKit.h>
3+
#import "RNMBXViewResolver.h"
34

45
#ifdef RCT_NEW_ARCH_ENABLED
56
#import "rnmapbox_maps_specs.h"
@@ -9,9 +10,9 @@
910

1011
@interface RNMBXShapeSourceModule : NSObject
1112
#ifdef RCT_NEW_ARCH_ENABLED
12-
<NativeRNMBXShapeSourceModuleSpec>
13+
<NativeRNMBXShapeSourceModuleSpec, RNMBXViewResolverDelegate>
1314
#else
14-
<RCTBridgeModule>
15+
<RCTBridgeModule, RNMBXViewResolverDelegate>
1516
#endif
1617

1718
@end

ios/RNMBX/RNMBXShapeSourceModule.mm

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -27,22 +27,14 @@ - (dispatch_queue_t)methodQueue
2727

2828
- (void)withShapeSource:(nonnull NSNumber*)viewRef block:(void (^)(RNMBXShapeSource *))block reject:(RCTPromiseRejectBlock)reject methodName:(NSString *)methodName
2929
{
30-
#ifdef RCT_NEW_ARCH_ENABLED
31-
[self.viewRegistry_DEPRECATED addUIBlock:^(RCTViewRegistry *viewRegistry) {
32-
RNMBXShapeSourceComponentView *componentView = [self.viewRegistry_DEPRECATED viewForReactTag:viewRef];
33-
RNMBXShapeSource *view = componentView.contentView;
34-
35-
#else
36-
[self.bridge.uiManager
37-
addUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *, UIView *> *viewRegistry) {
38-
RNMBXShapeSource *view = [uiManager viewForReactTag:viewRef];
39-
#endif // RCT_NEW_ARCH_ENABLED
40-
if (view != nil) {
41-
block(view);
42-
} else {
43-
reject(methodName, [NSString stringWithFormat:@"Unknown reactTag: %@", viewRef], nil);
44-
}
45-
}];
30+
[RNMBXViewResolver withViewRef:viewRef
31+
delegate:self
32+
expectedClass:[RNMBXShapeSource class]
33+
block:^(UIView *view) {
34+
block((RNMBXShapeSource *)view);
35+
}
36+
reject:reject
37+
methodName:methodName];
4638
}
4739

4840

ios/RNMBX/RNMBXViewportModule.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#import <Foundation/Foundation.h>
22
#import <UIKit/UIKit.h>
3+
#import "RNMBXViewResolver.h"
34

45
#ifdef RCT_NEW_ARCH_ENABLED
56
#import "rnmapbox_maps_specs.h"
@@ -9,9 +10,9 @@
910

1011
@interface RNMBXViewportModule : NSObject
1112
#ifdef RCT_NEW_ARCH_ENABLED
12-
<NativeRNMBXViewportModuleSpec>
13+
<NativeRNMBXViewportModuleSpec, RNMBXViewResolverDelegate>
1314
#else
14-
<RCTBridgeModule>
15+
<RCTBridgeModule, RNMBXViewResolverDelegate>
1516
#endif
1617

1718
@end

ios/RNMBX/RNMBXViewportModule.mm

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -36,22 +36,14 @@ - (dispatch_queue_t)methodQueue
3636

3737
- (void)withViewport:(nonnull NSNumber*)viewRef block:(void (^)(RNMBXViewport *))block reject:(RCTPromiseRejectBlock)reject methodName:(NSString *)methodName
3838
{
39-
#ifdef RCT_NEW_ARCH_ENABLED
40-
[self.viewRegistry_DEPRECATED addUIBlock:^(RCTViewRegistry *viewRegistry) {
41-
RNMBXViewportComponentView *componentView = [self.viewRegistry_DEPRECATED viewForReactTag:viewRef];
42-
RNMBXViewport *view = componentView.contentView;
43-
44-
#else
45-
[self.bridge.uiManager
46-
addUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *, UIView *> *viewRegistry) {
47-
RNMBXViewport *view = [uiManager viewForReactTag:viewRef];
48-
#endif // RCT_NEW_ARCH_ENABLED
49-
if (view != nil) {
50-
block(view);
51-
} else {
52-
reject(methodName, [NSString stringWithFormat:@"Unknown reactTag: %@", viewRef], nil);
53-
}
54-
}];
39+
[RNMBXViewResolver withViewRef:viewRef
40+
delegate:self
41+
expectedClass:[RNMBXViewport class]
42+
block:^(UIView *view) {
43+
block((RNMBXViewport *)view);
44+
}
45+
reject:reject
46+
methodName:methodName];
5547
}
5648

5749
RCT_EXPORT_METHOD(getState:(nonnull NSNumber *)viewRef

0 commit comments

Comments
 (0)