How to find the visible pushViewController from the navigation controller?
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 |
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 '18 at 12:58
I want to find WebPageViewController instance I pushed to the navigation controller
– Stéphane de Luca
Nov 22 '18 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 '18 at 14:43
I just don't get why you have the lineUIWindow.getVisibleViewControllerFrom(nc.visibleViewController)
forUINavigationController
. If you just pushed your controller,nc.visibleViewController
is 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
Dec 7 '18 at 14:48
add a comment |
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 '18 at 12:53
Stéphane de LucaStéphane de Luca
3,51033151
3,51033151
You want to find controller below your current controller in navigation stack?
– Gienadij Mackiewicz
Nov 22 '18 at 12:58
I want to find WebPageViewController instance I pushed to the navigation controller
– Stéphane de Luca
Nov 22 '18 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 '18 at 14:43
I just don't get why you have the lineUIWindow.getVisibleViewControllerFrom(nc.visibleViewController)
forUINavigationController
. If you just pushed your controller,nc.visibleViewController
is 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
Dec 7 '18 at 14:48
add a comment |
You want to find controller below your current controller in navigation stack?
– Gienadij Mackiewicz
Nov 22 '18 at 12:58
I want to find WebPageViewController instance I pushed to the navigation controller
– Stéphane de Luca
Nov 22 '18 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 '18 at 14:43
I just don't get why you have the lineUIWindow.getVisibleViewControllerFrom(nc.visibleViewController)
forUINavigationController
. If you just pushed your controller,nc.visibleViewController
is 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
Dec 7 '18 at 14:48
You want to find controller below your current controller in navigation stack?
– Gienadij Mackiewicz
Nov 22 '18 at 12:58
You want to find controller below your current controller in navigation stack?
– Gienadij Mackiewicz
Nov 22 '18 at 12:58
I want to find WebPageViewController instance I pushed to the navigation controller
– Stéphane de Luca
Nov 22 '18 at 13:04
I want to find WebPageViewController instance I pushed to the navigation controller
– Stéphane de Luca
Nov 22 '18 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 '18 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 '18 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.visibleViewController
is 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
Dec 7 '18 at 14:48
I just don't get why you have the line
UIWindow.getVisibleViewControllerFrom(nc.visibleViewController)
for UINavigationController
. If you just pushed your controller, nc.visibleViewController
is 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
Dec 7 '18 at 14:48
add a comment |
0
active
oldest
votes
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
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
0
active
oldest
votes
0
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.
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 '18 at 12:58
I want to find WebPageViewController instance I pushed to the navigation controller
– Stéphane de Luca
Nov 22 '18 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 '18 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.visibleViewController
is 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
Dec 7 '18 at 14:48