Skip to content

Commit bb04710

Browse files
committed
fix(ios): prevent error while overriding N gestures
1 parent a6349e8 commit bb04710

File tree

8 files changed

+25
-10
lines changed

8 files changed

+25
-10
lines changed

packages/gesturehandler/platforms/ios/src/GestureHandlerManager.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
- (void)updateGestureHandler:(nonnull NSNumber *)handlerTag config:(nonnull NSDictionary *)config;
1717

1818
- (void)dropGestureHandler:(nonnull NSNumber *)handlerTag;
19+
- (void)detachGestureHandler:(nonnull NSNumber *)handlerTag;
1920

2021
//- (void)handleSetJSResponder:(nonnull UIView *)view
2122
// blockNativeResponder:(nonnull NSNumber *)blockNativeResponder;

packages/gesturehandler/platforms/ios/src/GestureHandlerManager.m

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,10 @@ - (void)dropGestureHandler:(NSNumber *)handlerTag
8888
[_registry dropHandlerWithTag:handlerTag];
8989
}
9090

91+
- (void)detachGestureHandler:(NSNumber *)handlerTag
92+
{
93+
[_registry detachHandlerWithTag:handlerTag];
94+
}
9195
//- (void)handleSetJSResponder:(NSNumber *)viewTag blockNativeResponder:(NSNumber *)blockNativeResponder
9296
//{
9397
// if ([blockNativeResponder boolValue]) {

packages/gesturehandler/platforms/ios/src/GestureHandlerRegistry.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,7 @@
1414
- (void)registerGestureHandler:(nonnull GestureHandler *)gestureHandler;
1515
- (void)attachHandlerWithTag:(nonnull NSNumber *)handlerTag toView:(nonnull UIView *)view;
1616
- (void)dropHandlerWithTag:(nonnull NSNumber *)handlerTag;
17+
- (void)detachHandlerWithTag:(nonnull NSNumber *)handlerTag;
18+
- (void)detachHandlerWithTag:(nonnull NSNumber *)handlerTag;
1719

1820
@end

packages/gesturehandler/platforms/ios/src/GestureHandlerRegistry.m

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,9 @@ - (void)dropHandlerWithTag:(NSNumber *)handlerTag
4646
[_handlers removeObjectForKey:handlerTag];
4747
}
4848

49+
- (void)detachHandlerWithTag:(NSNumber *)handlerTag
50+
{
51+
GestureHandler *handler = _handlers[handlerTag];
52+
[handler unbindFromView];
53+
}
4954
@end

src/gesturehandler/gesturehandler.d.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export enum FlingDirection {
1010
DIRECTION_LEFT,
1111
DIRECTION_UP,
1212
DIRECTION_DOWN,
13-
DIRECTION_RIGHT,
13+
DIRECTION_RIGHT
1414
}
1515

1616
export abstract class BaseNative<T, U extends {}> extends Observable {
@@ -65,7 +65,7 @@ export abstract class Handler<T, U extends HandlerOptions> extends BaseNative<T,
6565
getView(): View;
6666
cancel();
6767
attachToView(view: View);
68-
detachFromView(view?: View);
68+
detachFromView(view?: View, drop?: boolean);
6969
}
7070
export interface TapGestureHandlerOptions extends HandlerOptions {
7171
numberOfTaps?: number;

src/gesturehandler/gesturehandler.ios.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -195,14 +195,14 @@ export class Handler<T extends GestureHandler, U extends HandlerOptions> extends
195195
return;
196196
}
197197
if (this.attachedView) {
198-
this.detachFromView(this.attachedView);
198+
this.detachFromView(this.attachedView, false);
199199
}
200200
this.attachedView = view;
201201
this.delegate = HandlerDelegate.initWithOwner(new WeakRef(this));
202202
this.native.delegate = this.delegate;
203203
this.manager.get().attachGestureHandler(this, view);
204204
}
205-
detachFromView(view?: View) {
205+
detachFromView(view?: View, drop = true) {
206206
if ((view && view !== this.attachedView) || !this.attachedView) {
207207
return;
208208
}
@@ -212,7 +212,7 @@ export class Handler<T extends GestureHandler, U extends HandlerOptions> extends
212212
}
213213
const tag = this.native.tag;
214214
this.delegate = this.native.delegate = null;
215-
this.manager.get().detachGestureHandler(tag, this.attachedView);
215+
this.manager.get().detachGestureHandler(tag, this.attachedView, drop);
216216
this.attachedView = null;
217217
}
218218
getTag() {
@@ -274,9 +274,11 @@ export class Manager extends ManagerBase {
274274
dispose: onDispose
275275
});
276276
}
277-
detachGestureHandler(handlerTag: number, view: View) {
278-
if (view.nativeView) {
277+
detachGestureHandler(handlerTag: number, view: View, drop = true) {
278+
if (drop) {
279279
this.manager.dropGestureHandler(handlerTag);
280+
} else {
281+
this.manager.detachGestureHandler(handlerTag);
280282
}
281283
if (view) {
282284
const viewListeners = this.viewListeners.get(view);

src/gesturehandler/gestures_override.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ export class GesturesObserver {
6060
}
6161

6262
public disconnect() {
63-
this._detach();
63+
this._detach(true);
6464

6565
if (this.target) {
6666
this.target.off('loaded', this._onTargetLoaded);
@@ -123,12 +123,12 @@ export class GesturesObserver {
123123
}
124124
}
125125

126-
private _detach() {
126+
private _detach(drop = false) {
127127
if (this.gestureHandler) {
128128
// dont detach events. It will be done on dispose
129129
// this.gestureHandler.off(GestureHandlerStateEvent);
130130
// this.gestureHandler.off(GestureHandlerTouchEvent);
131-
this.gestureHandler.detachFromView(this.target);
131+
this.gestureHandler.detachFromView(this.target, drop);
132132
}
133133
this._notifyTouch = false;
134134
this._eventData = {};

src/gesturehandler/typings/ios.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ declare class GestureHandlerManager extends NSObject {
157157
createGestureHandlerTagConfig(handlerName: string, handlerTag: number, config: NSDictionary<any, any>): GestureHandler;
158158

159159
dropGestureHandler(handlerTag: number): void;
160+
detachGestureHandler(handlerTag: number): void;
160161

161162
updateGestureHandlerConfig(handlerTag: number, config: NSDictionary<any, any>): void;
162163
}

0 commit comments

Comments
 (0)