Запретить представление UIAlertViewController после перехода к другому представлению - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть один сценарий, когда пользователь не использовал приложение более 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 имеет некоторую проверку, и если эта проверка не пройдена, он отображает всплывающее окно с сообщением и кнопкой ОК.

Таким образом, когда пользователь нажимает кнопку «ОК» во всплывающем сообщении об окончании сеанса, он перенаправляет пользователя на экран входа в систему, но из-за проверки метода делегата текстового поля он отображается в окне входа в систему.screen.

Код для всплывающего сообщения об ошибке проверки:

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 голосов
/ 06 декабря 2018
@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
            }
        }
    }

Попробуйте этот код, я много раз использовал этот код, возможно, он вам подойдет.

0 голосов
/ 06 декабря 2018

Я пытаюсь найти правильный способ предотвратить появление всплывающего окна на экране входа в систему.

Но, наконец, я нашел один способ решить эту проблему.

Я объявил один логический типв AppDelegate и установите его значение в false, когда я хочу предотвратить появление всплывающего окна, а затем верните его в значение true, когда я хочу показать всплывающее окно.

Я знаю, что это не элегантное или эффективное решение дляпроблема, но пока работает

...