@@ -75,6 +75,10 @@ extension SafariViewPresenter {
7575 // MARK: Presentation Handlers
7676
7777 private func presentSafariViewController( with item: Item ) {
78+ guard uiViewController. presentedViewController == nil else {
79+ return
80+ }
81+
7882 let representation = parent. representationBuilder ( item)
7983 let safariViewController = SFSafariViewController ( url: representation. url, configuration: representation. configuration)
8084 safariViewController. delegate = self
@@ -83,8 +87,9 @@ extension SafariViewPresenter {
8387 // There is a problem that page loading and parallel push animation are not working when a modifier is attached to the view in a `List`.
8488 // As a workaround, use a `rootViewController` of the `window` for presenting.
8589 // (Unlike the other view controllers, a view controller hosted by a cell doesn't have a parent, but has the same window.)
86- let presentingViewController = uiViewController. view. window? . rootViewController ?? uiViewController
87- presentingViewController. present ( safariViewController, animated: true )
90+ var presentingViewController = uiViewController. view. window? . rootViewController
91+ presentingViewController = presentingViewController? . presentedViewController ?? presentingViewController ?? uiViewController
92+ presentingViewController? . present ( safariViewController, animated: true )
8893 }
8994
9095 private func updateSafariViewController( with item: Item ) {
@@ -96,16 +101,22 @@ extension SafariViewPresenter {
96101 }
97102
98103 private func dismissSafariViewController( completion: ( ( ) -> Void ) ? = nil ) {
104+ let dismissCompletion : ( ) -> Void = {
105+ self . handleDismissalWithoutResettingItemBinding ( )
106+ completion ? ( )
107+ }
108+
109+ guard uiViewController. presentedViewController != nil else {
110+ dismissCompletion ( )
111+ return
112+ }
99113
100114 // Check if the `uiViewController` is a instance of the `SFSafariViewController`
101115 // to prevent other controllers presented by the container view from being dismissed unintentionally.
102- guard uiViewController. presentedViewController is SFSafariViewController else {
116+ guard let safariViewController = uiViewController. presentedViewController as? SFSafariViewController else {
103117 return
104118 }
105- uiViewController. dismiss ( animated: true ) {
106- self . handleDismissalWithoutResettingItemBinding ( )
107- completion ? ( )
108- }
119+ safariViewController. dismiss ( animated: true , completion: dismissCompletion)
109120 }
110121
111122 // MARK: Dismissal Handlers
0 commit comments