Skip to content

Instantly share code, notes, and snippets.

@gsampaio
Created December 14, 2018 15:53
Show Gist options
  • Save gsampaio/01c9e689bbb53640573af67e0781136a to your computer and use it in GitHub Desktop.
Save gsampaio/01c9e689bbb53640573af67e0781136a to your computer and use it in GitHub Desktop.
Injection Extensions for View Coding
extension UIViewController {
@objc func injected() {
for subview in self.view.subviews {
subview.removeFromSuperview()
}
loadView()
viewDidLoad()
}
}
extension UIView {
func findAndInject() {
for window in UIApplication.shared.windows {
if let rootViewController = window.rootViewController {
for viewController in topViewController(from: rootViewController) {
print("View Controller: \(viewController)")
if contains(viewController.view, contains: self) {
print("View Controller: \(viewController) with view")
viewController.injected()
}
}
}
}
}
@objc func injected() {
findAndInject()
}
}
func contains(_ view: UIView, contains target: UIView) -> Bool {
if view == target {
return true
} else {
for subview in view.subviews {
if contains(subview, contains: target) {
return true
}
}
}
return false
}
func topViewController(from rootViewController: UIViewController?, controllers: [UIViewController] = []) -> [UIViewController] {
guard let rootViewController = rootViewController else { return controllers }
var newControllers: [UIViewController] = []
newControllers += [rootViewController]
if let presented = rootViewController.presentedViewController {
newControllers += [presented] + topViewController(from: presented)
}
if let nav = rootViewController as? UINavigationController {
let viewControllers = nav.viewControllers.flatMap { topViewController(from: $0) }
newControllers += viewControllers
}
let set: Set<UIViewController> = Set(controllers + newControllers)
return Array(set)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment