How to find the visible pushViewController from the navigation controller?
up vote
0
down vote
favorite
My app layout consists of a tabbar, from each tab there is a navbar to which is attaches a UITableViewController.
When I didSelect a row, I push a view controller with becomes nicely embedded in the navigation bar.
I would like to find this latter view controller programmatically.
Here is how I push my visible view controller (streamlined version):
@objc
func tableView(_ tableView: UITableView, didSelectRowAtIndexPath indexPath: IndexPath) {
let vc = WebPageViewController()
navigationController?.pushViewController(vc, animated: true)
}
I did not managed to find a way. I am using this extension:
public extension UIWindow {
public var visibleViewController: UIViewController? {
return UIWindow.getVisibleViewControllerFrom(rootViewController)
}
public static func getVisibleViewControllerFrom(_ vc: UIViewController?) -> UIViewController? {
if let nc = vc as? UINavigationController {
return UIWindow.getVisibleViewControllerFrom(nc.visibleViewController)
} else if let tc = vc as? UITabBarController {
return UIWindow.getVisibleViewControllerFrom(tc.selectedViewController)
} else {
if let pvc = vc?.presentedViewController {
return UIWindow.getVisibleViewControllerFrom(pvc)
}
else if let pushed = vc?.childViewControllers.last {
return pushed
}
else {
return vc
}
}
}
}
uinavigationcontroller swift4
add a comment |
up vote
0
down vote
favorite
My app layout consists of a tabbar, from each tab there is a navbar to which is attaches a UITableViewController.
When I didSelect a row, I push a view controller with becomes nicely embedded in the navigation bar.
I would like to find this latter view controller programmatically.
Here is how I push my visible view controller (streamlined version):
@objc
func tableView(_ tableView: UITableView, didSelectRowAtIndexPath indexPath: IndexPath) {
let vc = WebPageViewController()
navigationController?.pushViewController(vc, animated: true)
}
I did not managed to find a way. I am using this extension:
public extension UIWindow {
public var visibleViewController: UIViewController? {
return UIWindow.getVisibleViewControllerFrom(rootViewController)
}
public static func getVisibleViewControllerFrom(_ vc: UIViewController?) -> UIViewController? {
if let nc = vc as? UINavigationController {
return UIWindow.getVisibleViewControllerFrom(nc.visibleViewController)
} else if let tc = vc as? UITabBarController {
return UIWindow.getVisibleViewControllerFrom(tc.selectedViewController)
} else {
if let pvc = vc?.presentedViewController {
return UIWindow.getVisibleViewControllerFrom(pvc)
}
else if let pushed = vc?.childViewControllers.last {
return pushed
}
else {
return vc
}
}
}
}
uinavigationcontroller swift4
You want to find controller below your current controller in navigation stack?
– Gienadij Mackiewicz
Nov 22 at 12:58
I want to find WebPageViewController instance I pushed to the navigation controller
– Stéphane de Luca
Nov 22 at 13:04
Answer depends on place where you need access WebPageViewController. If you want to find in somewhere in the same navigation controller it will look probably like this: ` if let viewController = self.navigationController?.viewControllers.first(where: { $0.isKind(of: SPBaseViewController.self) }) as? SPBaseViewController { }` but it only works if you have only one controller of that type in navigation stack.
– Gienadij Mackiewicz
Nov 22 at 14:43
I just don't get why you have the lineUIWindow.getVisibleViewControllerFrom(nc.visibleViewController)forUINavigationController. If you just pushed your controller,nc.visibleViewControlleris the one you want to have, so it's not necessary to call your extension's function again. If this controller has children controllers, you'll get the children instead of the one you want to have.
– Renaud
yesterday
add a comment |
up vote
0
down vote
favorite
up vote
0
down vote
favorite
My app layout consists of a tabbar, from each tab there is a navbar to which is attaches a UITableViewController.
When I didSelect a row, I push a view controller with becomes nicely embedded in the navigation bar.
I would like to find this latter view controller programmatically.
Here is how I push my visible view controller (streamlined version):
@objc
func tableView(_ tableView: UITableView, didSelectRowAtIndexPath indexPath: IndexPath) {
let vc = WebPageViewController()
navigationController?.pushViewController(vc, animated: true)
}
I did not managed to find a way. I am using this extension:
public extension UIWindow {
public var visibleViewController: UIViewController? {
return UIWindow.getVisibleViewControllerFrom(rootViewController)
}
public static func getVisibleViewControllerFrom(_ vc: UIViewController?) -> UIViewController? {
if let nc = vc as? UINavigationController {
return UIWindow.getVisibleViewControllerFrom(nc.visibleViewController)
} else if let tc = vc as? UITabBarController {
return UIWindow.getVisibleViewControllerFrom(tc.selectedViewController)
} else {
if let pvc = vc?.presentedViewController {
return UIWindow.getVisibleViewControllerFrom(pvc)
}
else if let pushed = vc?.childViewControllers.last {
return pushed
}
else {
return vc
}
}
}
}
uinavigationcontroller swift4
My app layout consists of a tabbar, from each tab there is a navbar to which is attaches a UITableViewController.
When I didSelect a row, I push a view controller with becomes nicely embedded in the navigation bar.
I would like to find this latter view controller programmatically.
Here is how I push my visible view controller (streamlined version):
@objc
func tableView(_ tableView: UITableView, didSelectRowAtIndexPath indexPath: IndexPath) {
let vc = WebPageViewController()
navigationController?.pushViewController(vc, animated: true)
}
I did not managed to find a way. I am using this extension:
public extension UIWindow {
public var visibleViewController: UIViewController? {
return UIWindow.getVisibleViewControllerFrom(rootViewController)
}
public static func getVisibleViewControllerFrom(_ vc: UIViewController?) -> UIViewController? {
if let nc = vc as? UINavigationController {
return UIWindow.getVisibleViewControllerFrom(nc.visibleViewController)
} else if let tc = vc as? UITabBarController {
return UIWindow.getVisibleViewControllerFrom(tc.selectedViewController)
} else {
if let pvc = vc?.presentedViewController {
return UIWindow.getVisibleViewControllerFrom(pvc)
}
else if let pushed = vc?.childViewControllers.last {
return pushed
}
else {
return vc
}
}
}
}
uinavigationcontroller swift4
uinavigationcontroller swift4
asked Nov 22 at 12:53
Stéphane de Luca
3,20732851
3,20732851
You want to find controller below your current controller in navigation stack?
– Gienadij Mackiewicz
Nov 22 at 12:58
I want to find WebPageViewController instance I pushed to the navigation controller
– Stéphane de Luca
Nov 22 at 13:04
Answer depends on place where you need access WebPageViewController. If you want to find in somewhere in the same navigation controller it will look probably like this: ` if let viewController = self.navigationController?.viewControllers.first(where: { $0.isKind(of: SPBaseViewController.self) }) as? SPBaseViewController { }` but it only works if you have only one controller of that type in navigation stack.
– Gienadij Mackiewicz
Nov 22 at 14:43
I just don't get why you have the lineUIWindow.getVisibleViewControllerFrom(nc.visibleViewController)forUINavigationController. If you just pushed your controller,nc.visibleViewControlleris the one you want to have, so it's not necessary to call your extension's function again. If this controller has children controllers, you'll get the children instead of the one you want to have.
– Renaud
yesterday
add a comment |
You want to find controller below your current controller in navigation stack?
– Gienadij Mackiewicz
Nov 22 at 12:58
I want to find WebPageViewController instance I pushed to the navigation controller
– Stéphane de Luca
Nov 22 at 13:04
Answer depends on place where you need access WebPageViewController. If you want to find in somewhere in the same navigation controller it will look probably like this: ` if let viewController = self.navigationController?.viewControllers.first(where: { $0.isKind(of: SPBaseViewController.self) }) as? SPBaseViewController { }` but it only works if you have only one controller of that type in navigation stack.
– Gienadij Mackiewicz
Nov 22 at 14:43
I just don't get why you have the lineUIWindow.getVisibleViewControllerFrom(nc.visibleViewController)forUINavigationController. If you just pushed your controller,nc.visibleViewControlleris the one you want to have, so it's not necessary to call your extension's function again. If this controller has children controllers, you'll get the children instead of the one you want to have.
– Renaud
yesterday
You want to find controller below your current controller in navigation stack?
– Gienadij Mackiewicz
Nov 22 at 12:58
You want to find controller below your current controller in navigation stack?
– Gienadij Mackiewicz
Nov 22 at 12:58
I want to find WebPageViewController instance I pushed to the navigation controller
– Stéphane de Luca
Nov 22 at 13:04
I want to find WebPageViewController instance I pushed to the navigation controller
– Stéphane de Luca
Nov 22 at 13:04
Answer depends on place where you need access WebPageViewController. If you want to find in somewhere in the same navigation controller it will look probably like this: ` if let viewController = self.navigationController?.viewControllers.first(where: { $0.isKind(of: SPBaseViewController.self) }) as? SPBaseViewController { }` but it only works if you have only one controller of that type in navigation stack.
– Gienadij Mackiewicz
Nov 22 at 14:43
Answer depends on place where you need access WebPageViewController. If you want to find in somewhere in the same navigation controller it will look probably like this: ` if let viewController = self.navigationController?.viewControllers.first(where: { $0.isKind(of: SPBaseViewController.self) }) as? SPBaseViewController { }` but it only works if you have only one controller of that type in navigation stack.
– Gienadij Mackiewicz
Nov 22 at 14:43
I just don't get why you have the line
UIWindow.getVisibleViewControllerFrom(nc.visibleViewController) for UINavigationController. If you just pushed your controller, nc.visibleViewControlleris the one you want to have, so it's not necessary to call your extension's function again. If this controller has children controllers, you'll get the children instead of the one you want to have.– Renaud
yesterday
I just don't get why you have the line
UIWindow.getVisibleViewControllerFrom(nc.visibleViewController) for UINavigationController. If you just pushed your controller, nc.visibleViewControlleris the one you want to have, so it's not necessary to call your extension's function again. If this controller has children controllers, you'll get the children instead of the one you want to have.– Renaud
yesterday
add a comment |
active
oldest
votes
active
oldest
votes
active
oldest
votes
active
oldest
votes
active
oldest
votes
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53431495%2fhow-to-find-the-visible-pushviewcontroller-from-the-navigation-controller%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
You want to find controller below your current controller in navigation stack?
– Gienadij Mackiewicz
Nov 22 at 12:58
I want to find WebPageViewController instance I pushed to the navigation controller
– Stéphane de Luca
Nov 22 at 13:04
Answer depends on place where you need access WebPageViewController. If you want to find in somewhere in the same navigation controller it will look probably like this: ` if let viewController = self.navigationController?.viewControllers.first(where: { $0.isKind(of: SPBaseViewController.self) }) as? SPBaseViewController { }` but it only works if you have only one controller of that type in navigation stack.
– Gienadij Mackiewicz
Nov 22 at 14:43
I just don't get why you have the line
UIWindow.getVisibleViewControllerFrom(nc.visibleViewController)forUINavigationController. If you just pushed your controller,nc.visibleViewControlleris the one you want to have, so it's not necessary to call your extension's function again. If this controller has children controllers, you'll get the children instead of the one you want to have.– Renaud
yesterday