Skip to content

Commit c6e5a21

Browse files
authored
Merge pull request #7 from bisonbet/pr-41-share-sheet
2 parents 708dfc7 + f44d432 commit c6e5a21

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
@@ -137,11 +137,56 @@
137137
popover.sourceRect = rect
138138
}
139139

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

0 commit comments

Comments
 (0)