Skip to content

Commit f44d432

Browse files
committed
fix(ios): present share sheet from topmost controller
1 parent 5b06b81 commit f44d432

1 file changed

Lines changed: 48 additions & 3 deletions

File tree

Sources/Textual/Internal/TextInteraction/UIKit/UITextInteractionView.swift

Lines changed: 48 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -136,11 +136,56 @@
136136
popover.sourceRect = rect
137137
}
138138

139-
if let windowScene = window?.windowScene,
140-
let viewController = windowScene.windows.first?.rootViewController
139+
if let presenter = topMostPresentingViewController() {
140+
presenter.present(activityViewController, animated: true)
141+
}
142+
}
143+
144+
private func topMostPresentingViewController() -> UIViewController? {
145+
let windowCandidates: [UIWindow]
146+
if let windowScene = window?.windowScene {
147+
windowCandidates = windowScene.windows
148+
} else {
149+
windowCandidates = UIApplication.shared.connectedScenes
150+
.compactMap { $0 as? UIWindowScene }
151+
.flatMap(\.windows)
152+
}
153+
154+
let sortedWindows = windowCandidates.sorted { lhs, rhs in
155+
if lhs.isKeyWindow != rhs.isKeyWindow {
156+
return lhs.isKeyWindow && !rhs.isKeyWindow
157+
}
158+
return lhs.windowLevel.rawValue > rhs.windowLevel.rawValue
159+
}
160+
161+
for window in sortedWindows {
162+
guard let rootViewController = window.rootViewController else { continue }
163+
if let presenter = topMostViewController(startingAt: rootViewController) {
164+
return presenter
165+
}
166+
}
167+
168+
return nil
169+
}
170+
171+
private func topMostViewController(startingAt viewController: UIViewController) -> UIViewController? {
172+
if let tabBarController = viewController as? UITabBarController,
173+
let selectedViewController = tabBarController.selectedViewController
141174
{
142-
viewController.present(activityViewController, animated: true)
175+
return topMostViewController(startingAt: selectedViewController)
143176
}
177+
178+
if let navigationController = viewController as? UINavigationController,
179+
let visibleViewController = navigationController.visibleViewController
180+
{
181+
return topMostViewController(startingAt: visibleViewController)
182+
}
183+
184+
if let presentedViewController = viewController.presentedViewController {
185+
return topMostViewController(startingAt: presentedViewController)
186+
}
187+
188+
return viewController
144189
}
145190
}
146191

0 commit comments

Comments
 (0)