Skip to content

Instantly share code, notes, and snippets.

@levantAJ
Last active June 1, 2021 02:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save levantAJ/47e98423cd2843e38c2708eb01b2a91f to your computer and use it in GitHub Desktop.
Save levantAJ/47e98423cd2843e38c2708eb01b2a91f to your computer and use it in GitHub Desktop.
Observe presented UIViewController is dismissed with UIModalPresentationStyle is custom
extension Reactive where Base: UIViewController {
var presenting: Observable<UIViewController> {
return sentMessage(#selector(Base.present(_:animated:completion:)))
.compactMap({ args -> UIViewController? in
return args.first as? UIViewController
})
.do(onError: { error in
assertionFailure("\(error)")
})
}
var dismissing: Observable<Void> {
return sentMessage(#selector(Base.dismiss(animated:completion:)))
.map { _ in Void() }
.do(onError: { error in
assertionFailure("\(error)")
})
}
var presentedViewControllerDismissed: Observable<UIViewController?> {
return makePresentingVC().flatMap({ presentedVC -> Observable<UIViewController?> in
let topVC: UIViewController? = (presentedVC as? UINavigationController)?.topViewController
let vc: UIViewController = topVC ?? presentedVC
return vc.rx.dismissing
.map({ [weak vc] _ -> UIViewController? in
return vc
})
})
}
private func makePresentingVC() -> Observable<UIViewController> {
if let presentedVC: UIViewController = base.presentedViewController {
return Observable.merge(
Observable<UIViewController>.just(presentedVC),
presenting
)
}
return presenting
}
}
@levantAJ
Copy link
Author

levantAJ commented May 27, 2021

How to use

let yourVC = UIViewController()
let disposeBag = DisposeBage()

yourVC.rx.presentedViewControllerDismissed
            .subscribe(onNext: { [weak self] presentedVC in
                print("presentedVC is dismissed", presentedVC)
            })
            .disposed(by: disposeBag)

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