@@ -350,16 +350,27 @@ export class ViewWithBottomSheet extends ViewWithBottomSheetBase {
350350 bottomSheetController : MDCBottomSheetController ;
351351 protected _showNativeBottomSheet ( parent : View , options : BottomSheetOptions ) {
352352 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 ;
357356 }
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+ }
363374 }
364375
365376 if ( ! parentController . view || ! parentController . view . window ) {
@@ -370,7 +381,7 @@ export class ViewWithBottomSheet extends ViewWithBottomSheetBase {
370381 this . parent = Application . getRootView ( ) ;
371382 this . _setupAsRootView ( { } ) ;
372383
373- this . _commonShowNativeBottomSheet ( parentWithController , options ) ;
384+ this . _commonShowNativeBottomSheet ( currentView , options ) ;
374385 let controller : IMDLayoutViewController = this . viewController ;
375386 if ( ! controller ) {
376387 const nativeView = this . ios || this . nativeViewProtected ;
@@ -462,13 +473,27 @@ export class ViewWithBottomSheet extends ViewWithBottomSheetBase {
462473 whenClosedCallback ?.( ) ;
463474 return ;
464475 }
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+ }
469496 }
470-
471- const parentController = parentWithController . viewController ;
472497 const animated = this . viewController . nsAnimated ;
473498 parentController . dismissViewControllerAnimatedCompletion ( animated , whenClosedCallback ) ;
474499 }
0 commit comments