Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -136,11 +136,56 @@
popover.sourceRect = rect
}

if let windowScene = window?.windowScene,
let viewController = windowScene.windows.first?.rootViewController
if let presenter = topMostPresentingViewController() {
presenter.present(activityViewController, animated: true)
}
}

private func topMostPresentingViewController() -> UIViewController? {
let windowCandidates: [UIWindow]
if let windowScene = window?.windowScene {
windowCandidates = windowScene.windows
} else {
windowCandidates = UIApplication.shared.connectedScenes
.compactMap { $0 as? UIWindowScene }
.flatMap(\.windows)
}

let sortedWindows = windowCandidates.sorted { lhs, rhs in
if lhs.isKeyWindow != rhs.isKeyWindow {
return lhs.isKeyWindow && !rhs.isKeyWindow
}
return lhs.windowLevel.rawValue > rhs.windowLevel.rawValue
}

for window in sortedWindows {
guard let rootViewController = window.rootViewController else { continue }
if let presenter = topMostViewController(startingAt: rootViewController) {
return presenter
}
}

return nil
}

private func topMostViewController(startingAt viewController: UIViewController) -> UIViewController? {
if let tabBarController = viewController as? UITabBarController,
let selectedViewController = tabBarController.selectedViewController
{
viewController.present(activityViewController, animated: true)
return topMostViewController(startingAt: selectedViewController)
Comment on lines +172 to +175

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Check presented modals before selected tab

When the root controller is a UITabBarController that is itself presenting a sheet containing this text view, this returns the selected tab instead of following tabBarController.presentedViewController. In that scenario the share action is no longer presented from the actual topmost controller, so UIKit can present behind/fail over the active sheet; recurse into presentedViewController before unwrapping tab/navigation containers.

Useful? React with 👍 / 👎.

}

if let navigationController = viewController as? UINavigationController,
let visibleViewController = navigationController.visibleViewController
{
return topMostViewController(startingAt: visibleViewController)
}

if let presentedViewController = viewController.presentedViewController {
return topMostViewController(startingAt: presentedViewController)
}

return viewController
}
}

Expand Down