@@ -19,15 +19,14 @@ const defaultAssetCollectionSubtypes: NSArray<any> = NSArray.arrayWithArray(<any
19
19
20
20
export class ImagePicker extends data_observable . Observable {
21
21
_imagePickerController : QBImagePickerController ;
22
- _imagePickerControllerDelegate : ImagePickerControllerDelegate ;
23
22
_hostView : View ;
24
23
25
24
// lazy-load latest frame.topmost() if _hostName is not used
26
25
get hostView ( ) {
27
26
return this . _hostView ;
28
27
}
29
28
30
- get hostController ( ) {
29
+ get hostController ( ) : UIViewController {
31
30
let vc = this . hostView ? this . hostView . viewController : UIApplication . sharedApplication . keyWindow . rootViewController ;
32
31
while (
33
32
vc . presentedViewController
@@ -43,9 +42,9 @@ export class ImagePicker extends data_observable.Observable {
43
42
super ( ) ;
44
43
45
44
this . _hostView = hostView ;
46
- this . _imagePickerControllerDelegate = ImagePickerControllerDelegate . new ( ) ;
47
45
48
46
let imagePickerController = QBImagePickerController . alloc ( ) . init ( ) ;
47
+
49
48
imagePickerController . assetCollectionSubtypes = defaultAssetCollectionSubtypes ;
50
49
imagePickerController . mediaType = options . mediaType ? < QBImagePickerMediaType > options . mediaType . valueOf ( ) : QBImagePickerMediaType . Any ;
51
50
imagePickerController . allowsMultipleSelection = options . mode !== 'single' ;
@@ -76,12 +75,13 @@ export class ImagePicker extends data_observable.Observable {
76
75
77
76
present ( ) {
78
77
return new Promise < void > ( ( resolve , reject ) => {
79
- this . _imagePickerControllerDelegate . _resolve = resolve ;
80
- this . _imagePickerControllerDelegate . _reject = reject ;
78
+ const imagePickerControllerDelegate = ImagePickerControllerDelegate . new ( ) ;
79
+ imagePickerControllerDelegate . _resolve = resolve ;
80
+ imagePickerControllerDelegate . _reject = reject ;
81
81
82
- this . hostController . presentViewControllerAnimatedCompletion ( this . _imagePickerController , true , ( ) => {
83
- this . _imagePickerController . delegate = this . _imagePickerControllerDelegate ;
84
- } ) ;
82
+ this . _imagePickerController . delegate = imagePickerControllerDelegate ;
83
+
84
+ this . hostController . presentViewControllerAnimatedCompletion ( this . _imagePickerController , true , null ) ;
85
85
} ) ;
86
86
}
87
87
}
@@ -93,6 +93,8 @@ export class ImagePickerControllerDelegate extends NSObject implements QBImagePi
93
93
qb_imagePickerControllerDidCancel ?( imagePickerController : QBImagePickerController ) : void {
94
94
imagePickerController . dismissViewControllerAnimatedCompletion ( true , null ) ;
95
95
this . _reject ( new Error ( "Selection canceled." ) ) ;
96
+
97
+ this . deRegisterFromGlobal ( ) ;
96
98
}
97
99
98
100
qb_imagePickerControllerDidFinishPickingAssets ?( imagePickerController : QBImagePickerController , iosAssets : NSArray < any > ) : void {
@@ -112,6 +114,7 @@ export class ImagePickerControllerDelegate extends NSObject implements QBImagePi
112
114
this . _resolve ( assets ) ;
113
115
114
116
imagePickerController . dismissViewControllerAnimatedCompletion ( true , ( ) => {
117
+ this . deRegisterFromGlobal ( ) ;
115
118
// FIX: possible memory issue when picking images many times.
116
119
// Not the best solution, but the only one working for now
117
120
// https://github.com/NativeScript/nativescript-imagepicker/issues/222
@@ -120,10 +123,24 @@ export class ImagePickerControllerDelegate extends NSObject implements QBImagePi
120
123
121
124
}
122
125
126
+ // FIX: stores a reference to global scope, so that the delegate is not collected in native
127
+ // https://github.com/NativeScript/nativescript-imagepicker/issues/251
128
+ private registerToGlobal ( ) : any {
129
+ ( < any > global ) . imagePickerControllerDelegate = this ;
130
+ }
131
+
132
+ private deRegisterFromGlobal ( ) : any {
133
+ ( < any > global ) . imagePickerControllerDelegate = null ;
134
+ }
135
+
123
136
public static ObjCProtocols = [ QBImagePickerControllerDelegate ] ;
124
137
125
138
static new ( ) : ImagePickerControllerDelegate {
126
- return < ImagePickerControllerDelegate > super . new ( ) ; // calls new() on the NSObject
139
+ const instance = < ImagePickerControllerDelegate > super . new ( ) ; // calls new() on the NSObject
140
+
141
+ instance . registerToGlobal ( ) ;
142
+
143
+ return instance ;
127
144
}
128
145
}
129
146
0 commit comments