在一种情况下,如果用户超过5分钟未使用该应用程序,则该应用程序将显示带有会话到期消息的弹出窗口。
会话过期代码已添加到appDelegate
中,并从此处显示弹出窗口。
代码为
@objc func applicationDidTimeout(notification: NSNotification) {
if (window?.rootViewController?.isKind(of: UITabBarController.self))! {
for view in window?.rootViewController?.view.subviews ?? [(window?.rootViewController?.view)!] {
if view.isKind(of: MBProgressHUD.self) {
return
}
}
if window?.rootViewController?.presentedViewController != nil {
window?.rootViewController?.dismiss(animated: true, completion: {
self.showMessage(message: Message.sessionTimeout)
})
} else {
self.showMessage(message: Message.sessionTimeout)
}
}
}
fileprivate func showMessage(message: String) {
let alert = UIAlertController(title: appName, message: message, preferredStyle: .alert)
let actionOkay = UIAlertAction(title: "OK", style: .default) { (action) in
DispatchQueue.main.async {
UIView.transition(with: self.window!, duration: 0.3, options: UIView.AnimationOptions.transitionCrossDissolve, animations: {
CommonFunctions.setLoginAsRootVC()
}, completion: nil)
}
}
alert.addAction(actionOkay)
self.window?.rootViewController?.present(alert, animated: true, completion: nil)
}
现在,如果用户正在输入一些数据,并且那时,如果用户离开应用程序理想状态5分钟或更长时间,键盘将关闭,并显示会话到期消息。
但是,由于文本字段的委托方法textFieldShouldEndEditing
进行了一些验证,如果验证失败,则会显示带有消息和“确定”按钮的弹出窗口。
因此,当用户在会话到期消息弹出窗口中点击“确定”按钮时,它将把用户重定向到登录屏幕,但是由于文本字段的委托方法验证,它在登录屏幕中显示了一个弹出窗口。 >
验证失败消息弹出窗口的代码为
fileprivate func showErrorMessage(message: String) {
let alert = UIAlertController(title: appName, message: message, preferredStyle: .alert)
let actionOkay = UIAlertAction(title: "OK", style: .default) { (action) in
self.txtField.becomeFirstResponder()
}
alert.addAction(actionOkay)
self.present(alert, animated: true, completion: nil)
}
如何防止弹出窗口出现在登录屏幕中?
答案 0 :(得分:0)
我试图找到一种适当的方法来防止弹出窗口出现在登录屏幕上。
但是最后,我找到了解决这个问题的办法。
我在AppDelegate中声明了一个布尔值,当我想防止弹出窗口出现时将其值设置为false,然后在我想显示弹出窗口时将其恢复为true。
我知道这不是解决该问题的优雅或有效的方法,但它目前可以使用。
如果有人知道更好的答案可以在这里发布,我仍然欢迎任何更好的解决方案。
答案 1 :(得分:0)
@objc func applicationDidTimeout(notification: NSNotification)
{
let visibleView : UIViewController = self.getVisibleViewControllerFrom(self.window?.rootViewController)!
self.showMessage(message: Message.sessionTimeout,Controller: visibleView)
}
fileprivate func showMessage(message: String , Controller : UIViewController) {
let alert = UIAlertController(title: appName, message: message, preferredStyle: .alert)
let actionOkay = UIAlertAction(title: "OK", style: .default) { (action) in
//Now apply your code here to set login view controller as rootview
// This controller is for demo
window!.rootViewController = UIStoryboard(name: "Main", bundle:
nil).instantiateViewController(withIdentifier: "loginview")
window!.makeKeyAndVisible()
}
alert.addAction(actionOkay)
Controller.present(alert, animated: true, completion: nil)
}
// MARK:-从窗口获取可见viewcontroller的支持方法
func getVisibleViewControllerFrom(_ vc: UIViewController?) -> UIViewController? {
if let nc = vc as? UINavigationController {
return self.getVisibleViewControllerFrom(nc.visibleViewController)
} else if let tc = vc as? UITabBarController {
return self.getVisibleViewControllerFrom(tc.selectedViewController)
} else {
if let pvc = vc?.presentedViewController {
return self.getVisibleViewControllerFrom(pvc)
} else {
return vc
}
}
}
尝试使用此代码,因为它对您有用,因此我已经使用了很多次。