How to find the visible pushViewController from the navigation controller?












0















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
}
}
}
}









share|improve this question























  • 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) 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
    Dec 7 '18 at 14:48


















0















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
}
}
}
}









share|improve this question























  • 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) 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
    Dec 7 '18 at 14:48
















0












0








0








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
}
}
}
}









share|improve this question














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






share|improve this question













share|improve this question











share|improve this question




share|improve this question










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 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
    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











  • 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) 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
    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.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
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.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
Dec 7 '18 at 14:48














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
});


}
});














draft saved

draft discarded


















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
















draft saved

draft discarded




















































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.




draft saved


draft discarded














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





















































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







Popular posts from this blog

Wiesbaden

Marschland

Dieringhausen