注销后如何关闭推送的ViewController?
How to dismiss pushed ViewController after logout?
我在这个问题上花了很多时间,所以找不到任何解决方案。
我使用 pushViewController
方法(这里有问题)和菜单(非模态)从我的 TopBar 打开设置ViewController。
我想在点击注销按钮时关闭此推送 ViewController。
下面是我在某些 VC 中使用的功能,并且效果很好。
func goToSettingsView() {
let vc = SettingsViewController(nibName: "SettingsViewController", bundle: nil)
vc.modalPresentationStyle = .fullScreen
self.navigationController!.pushViewController(vc, animated: true)
for constraint in vc.view.constraints {
if constraint.identifier == "alignTopHeader" {
constraint.constant = 0
}
}
}
当我单击注销按钮时不起作用,当我从 (LoginViewController) 登录时,此设置ViewController 仍在显示,但我会在没有任何模式的情况下进入主屏幕。
我做了一些想法,但还没有做好。
第一个想法是:
下面是我在设置中的注销IBactionViewController:
- (void)logout {
[self dismissViewControllerAnimated:YES completion:nil];
[[UserManager shared] logoutUserWithSuccessBlock:^{
[self presentLoginViewController];
}];
}
登录ViewController 被关闭,但自己是设置的目标ViewController?
第二个想法:
我在 LoginViewController 中添加了一个在 AppDelegate "backToRoot" 中声明的函数,并从 viewWillDisappear 调用。
[appDelegate backToRoot];
AppDelegate.m 文件中的函数
-(void)backToRoot {
[self.navigationController dismissViewControllerAnimated:YES completion:nil];
PresentationsPickerViewController *mainvc = [[PresentationsPickerViewController alloc] init];
[self setCenterPanelWithViewController:mainvc];
}
但仍然无法使用模态,当设置ViewController 不是模态时它工作正常。
您知道如何在注销操作中hide/dismiss推送设置ViewController吗?
真的很简单。如果您想关闭导航堆栈中的推送 UIViewController
,只需将其弹出,如下所示:
func logout() {
navigationController?.popViewController(animated: true)
}
您可以简单地关闭根视图控制器上方的所有视图控制器。
func logout() {
self.view.window!.rootViewController?.dismiss(animated: false, completion: nil)
}
希望对您有所帮助。谢谢
I want to dismiss this pushed ViewController when I tap on logout button.
现在您不会拒绝推送的 UIViewController
。推送是一种与 UINavigationController
关联的导航样式。当您按下 UIViewController
时,您需要弹出它。
当我们谈论关闭时,我们通常指的是关闭模态呈现的 UIViewController
。此方法意味着在您之前显示的 UIViewController
或从其继承的任何 class 之上添加一个新的 UIViewController
。这不会添加到导航堆栈中。您只能在 UIViewController
出现时将其关闭。
现在您的第一个代码块显示您推动了 SettingsViewController
并且您的第一个解决方案试图将其关闭。这是行不通的。您需要从 UINavigationController
弹出它才能关闭它。
接下来,
LoginViewController is dismiss, but self is targeted for SettingsViewController?
方法[self dismiss]...
将关闭顶部最新显示的屏幕。如果您在设置中显示 LoginViewController
,则会关闭 LoginViewController
屏幕。
此外,
But still not working with modal, it's work fine when SettingsViewController isn't modal. Do you have any ideas how to hide/dismiss pushed SettingsViewController in logout action?
如果你的 SettingsViewController
出现了,那么你需要关闭它,如果它被推送,你需要弹出它。
如果在某些情况下这两个操作都可能发生,那么在您的关闭按钮操作上,您可以检查屏幕是如何显示的。使用 this link 计算出检查结果。
如果您只想在注销时转到 LoginViewController
,您只需更改应用程序的根目录 window。
let window = (UIApplication.shared.delegate as? AppDelegate)?.window
window?.rootViewController = viewController //this will be your loginViewController
window?.makeKeyAndVisible()
对于 iOS 13:
UIApplication.shared.windows.first?.rootViewController = LoginViewController
UIApplication.shared.windows.first?.makeKeyAndVisible()
我在这个问题上花了很多时间,所以找不到任何解决方案。
我使用 pushViewController
方法(这里有问题)和菜单(非模态)从我的 TopBar 打开设置ViewController。
我想在点击注销按钮时关闭此推送 ViewController。
下面是我在某些 VC 中使用的功能,并且效果很好。
func goToSettingsView() {
let vc = SettingsViewController(nibName: "SettingsViewController", bundle: nil)
vc.modalPresentationStyle = .fullScreen
self.navigationController!.pushViewController(vc, animated: true)
for constraint in vc.view.constraints {
if constraint.identifier == "alignTopHeader" {
constraint.constant = 0
}
}
}
当我单击注销按钮时不起作用,当我从 (LoginViewController) 登录时,此设置ViewController 仍在显示,但我会在没有任何模式的情况下进入主屏幕。
我做了一些想法,但还没有做好。
第一个想法是:
下面是我在设置中的注销IBactionViewController:
- (void)logout {
[self dismissViewControllerAnimated:YES completion:nil];
[[UserManager shared] logoutUserWithSuccessBlock:^{
[self presentLoginViewController];
}];
}
登录ViewController 被关闭,但自己是设置的目标ViewController?
第二个想法:
我在 LoginViewController 中添加了一个在 AppDelegate "backToRoot" 中声明的函数,并从 viewWillDisappear 调用。
[appDelegate backToRoot];
AppDelegate.m 文件中的函数
-(void)backToRoot {
[self.navigationController dismissViewControllerAnimated:YES completion:nil];
PresentationsPickerViewController *mainvc = [[PresentationsPickerViewController alloc] init];
[self setCenterPanelWithViewController:mainvc];
}
但仍然无法使用模态,当设置ViewController 不是模态时它工作正常。
您知道如何在注销操作中hide/dismiss推送设置ViewController吗?
真的很简单。如果您想关闭导航堆栈中的推送 UIViewController
,只需将其弹出,如下所示:
func logout() {
navigationController?.popViewController(animated: true)
}
您可以简单地关闭根视图控制器上方的所有视图控制器。
func logout() {
self.view.window!.rootViewController?.dismiss(animated: false, completion: nil)
}
希望对您有所帮助。谢谢
I want to dismiss this pushed ViewController when I tap on logout button.
现在您不会拒绝推送的 UIViewController
。推送是一种与 UINavigationController
关联的导航样式。当您按下 UIViewController
时,您需要弹出它。
当我们谈论关闭时,我们通常指的是关闭模态呈现的 UIViewController
。此方法意味着在您之前显示的 UIViewController
或从其继承的任何 class 之上添加一个新的 UIViewController
。这不会添加到导航堆栈中。您只能在 UIViewController
出现时将其关闭。
现在您的第一个代码块显示您推动了 SettingsViewController
并且您的第一个解决方案试图将其关闭。这是行不通的。您需要从 UINavigationController
弹出它才能关闭它。
接下来,
LoginViewController is dismiss, but self is targeted for SettingsViewController?
方法[self dismiss]...
将关闭顶部最新显示的屏幕。如果您在设置中显示 LoginViewController
,则会关闭 LoginViewController
屏幕。
此外,
But still not working with modal, it's work fine when SettingsViewController isn't modal. Do you have any ideas how to hide/dismiss pushed SettingsViewController in logout action?
如果你的 SettingsViewController
出现了,那么你需要关闭它,如果它被推送,你需要弹出它。
如果在某些情况下这两个操作都可能发生,那么在您的关闭按钮操作上,您可以检查屏幕是如何显示的。使用 this link 计算出检查结果。
如果您只想在注销时转到 LoginViewController
,您只需更改应用程序的根目录 window。
let window = (UIApplication.shared.delegate as? AppDelegate)?.window
window?.rootViewController = viewController //this will be your loginViewController
window?.makeKeyAndVisible()
对于 iOS 13:
UIApplication.shared.windows.first?.rootViewController = LoginViewController
UIApplication.shared.windows.first?.makeKeyAndVisible()