@@ -74,6 +74,7 @@ class MDCDialogPresentationControllerDelegateImpl extends NSObject {
74
74
return delegate ;
75
75
}
76
76
dialogPresentationControllerDidDismiss ( controller : MDCDialogPresentationController ) {
77
+ // WARNING: only called when clicked on background!
77
78
const callback = this . _callback ;
78
79
if ( callback ) {
79
80
callback ( ) ;
@@ -83,6 +84,7 @@ class MDCDialogPresentationControllerDelegateImpl extends NSObject {
83
84
@NativeClass
84
85
class MDCAlertControllerImpl extends MDCAlertController {
85
86
autoFocusTextField ?: TextField ;
87
+ clear : Function ;
86
88
_resolveFunction ?: Function ;
87
89
_disableContentInsets : boolean ;
88
90
viewDidAppear ( animated : boolean ) {
@@ -99,20 +101,27 @@ class MDCAlertControllerImpl extends MDCAlertController {
99
101
( this . view as MDCAlertControllerView ) . contentInsets = UIEdgeInsetsZero ;
100
102
}
101
103
}
102
- viewDidUnload ( ) {
103
- super . viewDidUnload ( ) ;
104
- if ( this . accessoryView instanceof UIViewAutoSizeUIViewAutoSize ) {
105
- const view = this . accessoryView . _view ;
106
- view . callUnloaded ( ) ;
107
- view . _tearDownUI ( true ) ;
108
- view . parent = null ;
109
- view . _isAddedToNativeVisualTree = false ;
110
- this . accessoryView . _view = null ;
111
- }
112
- }
104
+ viewDidLayoutSubviews ( ) {
105
+ // we enforce the bounds first
106
+ // when showing a modal on top of us and then hiding the modal, our size gets messed up
107
+ this . view . bounds = CGRectMake ( 0 , 0 , this . preferredContentSize . width , this . preferredContentSize . height ) ;
108
+ super . viewDidLayoutSubviews ( ) ;
109
+ }
110
+ // viewDidUnload is not called anymore
111
+ // viewDidUnload() {
112
+ // super.viewDidUnload();
113
+ // if (this.accessoryView instanceof UIViewAutoSizeUIViewAutoSize) {
114
+ // const view = this.accessoryView._view;
115
+ // view.callUnloaded();
116
+ // view._tearDownUI(true);
117
+ // view.parent = null;
118
+ // view._isAddedToNativeVisualTree = false;
119
+ // this.accessoryView._view = null;
120
+ // }
121
+ // }
113
122
}
114
123
115
- function addButtonsToAlertController ( alertController : MDCAlertController , options : ConfirmOptions & MDCAlertControlerOptions , callback ?: Function , validationArgs ?: ( r ) => any ) : void {
124
+ function addButtonsToAlertController ( alertController : MDCAlertControllerImpl , options : ConfirmOptions & MDCAlertControlerOptions , callback ?: Function , validationArgs ?: ( r ) => any ) : void {
116
125
if ( ! options ) {
117
126
return ;
118
127
}
@@ -128,7 +137,9 @@ function addButtonsToAlertController(alertController: MDCAlertController, option
128
137
if ( Utils . isFunction ( callback ) ) {
129
138
callback ( result ) ;
130
139
}
131
- alertController . dismissModalViewControllerAnimated ( true ) ;
140
+ alertController . dismissViewControllerAnimatedCompletion ( true , ( ) => {
141
+ alertController . clear ( ) ;
142
+ } ) ;
132
143
}
133
144
let buttonsFont ;
134
145
@@ -159,6 +170,7 @@ function addButtonsToAlertController(alertController: MDCAlertController, option
159
170
160
171
function createAlertController ( options : DialogOptions & MDCAlertControlerOptions , resolve ?: Function ) {
161
172
const alertController = MDCAlertControllerImpl . alloc ( ) . init ( ) as MDCAlertControllerImpl ;
173
+ alertController [ 'isAlertController' ] = true ;
162
174
alertController . mdc_adjustsFontForContentSizeCategory = true ;
163
175
164
176
if ( options . title ) {
@@ -167,6 +179,20 @@ function createAlertController(options: DialogOptions & MDCAlertControlerOptions
167
179
if ( options . message ) {
168
180
alertController . message = options . message ;
169
181
}
182
+
183
+ const clear = ( alertController . clear = function clear ( ) {
184
+ alertController . _resolveFunction = null ;
185
+ if ( alertController . accessoryView instanceof UIViewAutoSizeUIViewAutoSize ) {
186
+ const view = alertController . accessoryView . _view ;
187
+ view . callUnloaded ( ) ;
188
+ view . _tearDownUI ( true ) ;
189
+ view . parent = null ;
190
+ view . _isAddedToNativeVisualTree = false ;
191
+ alertController . accessoryView . _view = null ;
192
+ }
193
+ alertController . _resolveFunction = null ;
194
+ alertController . mdc_dialogPresentationController . delegate = null ;
195
+ } ) ;
170
196
// if (options.buttonFont) {
171
197
// alertController.buttonFont = options.buttonFont.getUIFont(alertController.buttonFont);
172
198
// }
@@ -186,11 +212,13 @@ function createAlertController(options: DialogOptions & MDCAlertControlerOptions
186
212
alertController . _resolveFunction = resolve ;
187
213
const context = options . context || { } ;
188
214
context . closeCallback = function ( ...originalArgs ) {
189
- alertController . dismissModalViewControllerAnimated ( true ) ;
190
215
if ( alertController . _resolveFunction && resolve ) {
191
216
alertController . _resolveFunction = null ;
192
217
resolve . apply ( this , originalArgs ) ;
193
218
}
219
+ alertController . dismissViewControllerAnimatedCompletion ( true , ( ) => {
220
+ clear ( ) ;
221
+ } ) ;
194
222
} ;
195
223
view . bindingContext = fromObject ( context ) ;
196
224
alertController . accessoryView = createUIViewAutoSizeUIViewAutoSize ( view ) ;
@@ -206,9 +234,8 @@ function createAlertController(options: DialogOptions & MDCAlertControlerOptions
206
234
view . viewController = alertController ; // needed to prevent a crash in layoutChild
207
235
}
208
236
const dialogPresentationControllerDelegate = MDCDialogPresentationControllerDelegateImpl . initWithCallback ( ( ) => {
209
- resolve && resolve ( ) ;
210
- alertController . _resolveFunction = null ;
211
- alertController . mdc_dialogPresentationController . delegate = null ;
237
+ resolve ?.( ) ;
238
+ clear ( ) ;
212
239
} ) ;
213
240
alertController . mdc_dialogPresentationController . dialogPresentationControllerDelegate = dialogPresentationControllerDelegate ;
214
241
@@ -236,7 +263,6 @@ export function alert(arg: any): Promise<any> {
236
263
const alertController = createAlertController ( options , resolve ) ;
237
264
238
265
addButtonsToAlertController ( alertController , options , ( result ) => {
239
- alertController . _resolveFunction = null ;
240
266
resolve ( result ) ;
241
267
} ) ;
242
268
@@ -248,7 +274,7 @@ export function alert(arg: any): Promise<any> {
248
274
}
249
275
250
276
export class AlertDialog {
251
- alertController : MDCAlertController ;
277
+ alertController : MDCAlertControllerImpl ;
252
278
presentingController : UIViewController ;
253
279
constructor ( private options : any ) { }
254
280
@@ -261,7 +287,10 @@ export class AlertDialog {
261
287
async hide ( ) {
262
288
if ( this . presentingController ) {
263
289
return new Promise < void > ( ( resolve ) => {
264
- this . presentingController . dismissViewControllerAnimatedCompletion ( true , resolve ) ;
290
+ this . presentingController . dismissViewControllerAnimatedCompletion ( true , ( ) => {
291
+ resolve ?.( ) ;
292
+ this . alertController . clear ( ) ;
293
+ } ) ;
265
294
this . presentingController = null ;
266
295
this . alertController = null ;
267
296
} ) ;
@@ -534,7 +563,7 @@ function showUIAlertController(alertController: MDCAlertController, options: Dia
534
563
535
564
let viewController = Application . ios . rootController ;
536
565
537
- while ( viewController && viewController . presentedViewController && ! ( viewController . presentedViewController instanceof MDCAlertControllerImpl ) ) {
566
+ while ( viewController && viewController . presentedViewController ) {
538
567
viewController = viewController . presentedViewController ;
539
568
}
540
569
0 commit comments