@@ -19,15 +19,14 @@ const defaultAssetCollectionSubtypes: NSArray<any> = NSArray.arrayWithArray(<any
1919
2020export class ImagePicker extends data_observable . Observable {
2121 _imagePickerController : QBImagePickerController ;
22- _imagePickerControllerDelegate : ImagePickerControllerDelegate ;
2322 _hostView : View ;
2423
2524 // lazy-load latest frame.topmost() if _hostName is not used
2625 get hostView ( ) {
2726 return this . _hostView ;
2827 }
2928
30- get hostController ( ) {
29+ get hostController ( ) : UIViewController {
3130 let vc = this . hostView ? this . hostView . viewController : UIApplication . sharedApplication . keyWindow . rootViewController ;
3231 while (
3332 vc . presentedViewController
@@ -43,9 +42,9 @@ export class ImagePicker extends data_observable.Observable {
4342 super ( ) ;
4443
4544 this . _hostView = hostView ;
46- this . _imagePickerControllerDelegate = ImagePickerControllerDelegate . new ( ) ;
4745
4846 let imagePickerController = QBImagePickerController . alloc ( ) . init ( ) ;
47+
4948 imagePickerController . assetCollectionSubtypes = defaultAssetCollectionSubtypes ;
5049 imagePickerController . mediaType = options . mediaType ? < QBImagePickerMediaType > options . mediaType . valueOf ( ) : QBImagePickerMediaType . Any ;
5150 imagePickerController . allowsMultipleSelection = options . mode !== 'single' ;
@@ -76,12 +75,13 @@ export class ImagePicker extends data_observable.Observable {
7675
7776 present ( ) {
7877 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 ;
8181
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 ) ;
8585 } ) ;
8686 }
8787}
@@ -93,6 +93,8 @@ export class ImagePickerControllerDelegate extends NSObject implements QBImagePi
9393 qb_imagePickerControllerDidCancel ?( imagePickerController : QBImagePickerController ) : void {
9494 imagePickerController . dismissViewControllerAnimatedCompletion ( true , null ) ;
9595 this . _reject ( new Error ( "Selection canceled." ) ) ;
96+
97+ this . deRegisterFromGlobal ( ) ;
9698 }
9799
98100 qb_imagePickerControllerDidFinishPickingAssets ?( imagePickerController : QBImagePickerController , iosAssets : NSArray < any > ) : void {
@@ -112,6 +114,7 @@ export class ImagePickerControllerDelegate extends NSObject implements QBImagePi
112114 this . _resolve ( assets ) ;
113115
114116 imagePickerController . dismissViewControllerAnimatedCompletion ( true , ( ) => {
117+ this . deRegisterFromGlobal ( ) ;
115118 // FIX: possible memory issue when picking images many times.
116119 // Not the best solution, but the only one working for now
117120 // https://github.com/NativeScript/nativescript-imagepicker/issues/222
@@ -120,10 +123,24 @@ export class ImagePickerControllerDelegate extends NSObject implements QBImagePi
120123
121124 }
122125
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+
123136 public static ObjCProtocols = [ QBImagePickerControllerDelegate ] ;
124137
125138 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 ;
127144 }
128145}
129146
0 commit comments