@@ -350,16 +350,27 @@ export class ViewWithBottomSheet extends ViewWithBottomSheetBase {
350
350
bottomSheetController : MDCBottomSheetController ;
351
351
protected _showNativeBottomSheet ( parent : View , options : BottomSheetOptions ) {
352
352
options . context = options . context || { } ;
353
- const parentWithController = IOSHelper . getParentWithViewController ( parent ) ;
354
- if ( ! parentWithController ) {
355
- Trace . write ( `Could not find parent with viewController for ${ parent } while showing bottom sheet view.` , Trace . categories . ViewHierarchy , Trace . messageType . error ) ;
356
- return ;
353
+ let rootView = Application . getRootView ( ) ;
354
+ if ( rootView . parent ) {
355
+ rootView = rootView . parent as any ;
357
356
}
358
-
359
- const parentController = parentWithController . viewController ;
360
- if ( parentController . presentedViewController ) {
361
- Trace . write ( 'Parent is already presenting view controller. Close the current bottom sheet page before showing another one!' , Trace . categories . ViewHierarchy , Trace . messageType . error ) ;
362
- return ;
357
+ let currentView = parent . page || rootView ;
358
+ currentView = currentView . modal || currentView ;
359
+ let parentController = currentView . viewController ;
360
+ if ( ! parentController . presentedViewController && rootView . viewController . presentedViewController ) {
361
+ parentController = rootView . viewController . presentedViewController ;
362
+ }
363
+ while ( parentController . presentedViewController ) {
364
+ while ( parentController . presentedViewController instanceof UIAlertController ||
365
+ ( parentController . presentedViewController [ 'isAlertController' ] && parentController . presentedViewController . presentedViewController ) ) {
366
+ parentController = parentController . presentedViewController ;
367
+ }
368
+ if ( parentController . presentedViewController instanceof UIAlertController || parentController . presentedViewController [ 'isAlertController' ] ) {
369
+ break ;
370
+ }
371
+ else {
372
+ parentController = parentController . presentedViewController ;
373
+ }
363
374
}
364
375
365
376
if ( ! parentController . view || ! parentController . view . window ) {
@@ -370,7 +381,7 @@ export class ViewWithBottomSheet extends ViewWithBottomSheetBase {
370
381
this . parent = Application . getRootView ( ) ;
371
382
this . _setupAsRootView ( { } ) ;
372
383
373
- this . _commonShowNativeBottomSheet ( parentWithController , options ) ;
384
+ this . _commonShowNativeBottomSheet ( currentView , options ) ;
374
385
let controller : IMDLayoutViewController = this . viewController ;
375
386
if ( ! controller ) {
376
387
const nativeView = this . ios || this . nativeViewProtected ;
@@ -462,13 +473,27 @@ export class ViewWithBottomSheet extends ViewWithBottomSheetBase {
462
473
whenClosedCallback ?.( ) ;
463
474
return ;
464
475
}
465
- const parentWithController = IOSHelper . getParentWithViewController ( parent ) ;
466
- if ( ! parent || ! parentWithController ) {
467
- Trace . error ( 'Trying to hide bottom-sheet view but no parent with viewController specified.' ) ;
468
- return ;
476
+ let rootView = Application . getRootView ( ) ;
477
+ if ( rootView . parent ) {
478
+ rootView = rootView . parent as any ;
479
+ }
480
+ let currentView = parent . modal || parent ;
481
+ let parentController = currentView . viewController ;
482
+ if ( ! parentController . presentedViewController && rootView . viewController . presentedViewController ) {
483
+ parentController = rootView . viewController . presentedViewController ;
484
+ }
485
+ while ( parentController . presentedViewController ) {
486
+ while ( parentController . presentedViewController instanceof UIAlertController ||
487
+ ( parentController . presentedViewController [ 'isAlertController' ] && parentController . presentedViewController . presentedViewController ) ) {
488
+ parentController = parentController . presentedViewController ;
489
+ }
490
+ if ( parentController . presentedViewController instanceof UIAlertController || parentController . presentedViewController [ 'isAlertController' ] ) {
491
+ break ;
492
+ }
493
+ else {
494
+ parentController = parentController . presentedViewController ;
495
+ }
469
496
}
470
-
471
- const parentController = parentWithController . viewController ;
472
497
const animated = this . viewController . nsAnimated ;
473
498
parentController . dismissViewControllerAnimatedCompletion ( animated , whenClosedCallback ) ;
474
499
}
0 commit comments