导航到其他视图后,防止显示UIAlertViewController

时间:2018-12-05 12:45:59

标签: ios uialertcontroller swift4.2

在一种情况下,如果用户超过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)
}

如何防止弹出窗口出现在登录屏幕中?

2 个答案:

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

尝试使用此代码,因为它对您有用,因此我已经使用了很多次。