Created
December 14, 2018 15:53
-
-
Save gsampaio/01c9e689bbb53640573af67e0781136a to your computer and use it in GitHub Desktop.
Injection Extensions for View Coding
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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