Skip to content

Instantly share code, notes, and snippets.

@timothycosta
Last active April 28, 2023 07:00
Show Gist options
  • Save timothycosta/a43dfe25f1d8a37c71341a1ebaf82213 to your computer and use it in GitHub Desktop.
Save timothycosta/a43dfe25f1d8a37c71341a1ebaf82213 to your computer and use it in GitHub Desktop.
Using UIViewController via the SwiftUI Environment
struct ViewControllerHolder {
weak var value: UIViewController?
init(_ value: UIViewController?) {
self.value = value
}
}
struct ViewControllerKey: EnvironmentKey {
static var defaultValue: ViewControllerHolder { return ViewControllerHolder(UIApplication.shared.windows.first?.rootViewController ) }
}
extension EnvironmentValues {
var viewController: ViewControllerHolder {
get { return self[ViewControllerKey.self] }
set { self[ViewControllerKey.self] = newValue }
}
}
extension UIViewController {
func present<Content: View>(presentationStyle: UIModalPresentationStyle = .automatic, transitionStyle: UIModalTransitionStyle = .coverVertical, animated: Bool = true, completion: @escaping () -> Void = {}, @ViewBuilder builder: () -> Content) {
let toPresent = UIHostingController(rootView: AnyView(EmptyView()))
toPresent.modalPresentationStyle = presentationStyle
toPresent.rootView = AnyView(
builder()
.environment(\.viewController, ViewControllerHolder(toPresent))
)
if presentationStyle == .overCurrentContext {
toPresent.view.backgroundColor = .clear
}
self.present(toPresent, animated: animated, completion: completion)
}
}
@haikusw
Copy link

haikusw commented Jan 12, 2021

@Sadmansamee

@Environment(\.viewController) private var viewControllerHolder: ViewControllerHolder?
private var viewController: UIViewController? {
   self.viewControllerHolder?.value
}

with this code I'm getting error like

Key path value type 'ViewControllerHolder' cannot be converted to contextual type 'ViewControllerHolder?

Don't have time to test this but maybe try:

@Environment(\.viewController) private var viewControllerHolder: ViewControllerHolder
private var viewController: UIViewController? {
    self.viewControllerHolder.value
}

Reading the gist, Line 14 defines viewController to return a non-optional ViewControllerHolder so I'm guessing that's the issue you're running into.

@pushpankq
Copy link

and how to dismiss it

@iosdroid
Copy link

iosdroid commented Feb 4, 2022

its support for RTL?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment