【问题标题】:Swift Segue - while an existing transition or presentation is occurring; the navigation stack will not be updatedSwift Segue - 当现有的过渡或演示发生时;导航堆栈将不会更新
【发布时间】:2020-07-03 20:57:54
【问题描述】:

在 updatePassword 函数之外触发时,segue 可以正常工作。

完全错误 - '2020-07-03 13:17:34.656198+0100 FindingTaylorSwift[5305:154832] pushViewController:animated: 在发生现有转换或演示时调用 ;导航堆栈将不会更新。'

    @IBAction func updatePasword(_ sender: UIButton) {
.....
  
        _ = self.awsUserPoolUpdatePassword.updatePasswordWithConfirmationCodeError?
            .subscribe({ errorText in
                guard let elementContent = errorText.element?.localizedDescription else { return }

                switch elementContent {
                case "The operation couldn’t be completed. (AWSMobileClient.AWSMobileClientError error 2.)":
                    self.showAlert(title: UpdatePasswordError.titleCode, message: UpdatePasswordError.messageCode)
                case "The operation couldn’t be completed. (AWSMobileClient.AWSMobileClientError error 8.)":
                    self.showAlert(title: UpdatePasswordError.titlePassword, message: UpdatePasswordError.messagePasswordShort)
                case "The operation couldn’t be completed. (AWSMobileClient.AWSMobileClientError error 9.)":
                    self.showAlert(title: UpdatePasswordError.titlePassword, message: UpdatePasswordError.messagePasswordComplexity)
                default:
                    self.showAlert(title: UpdatePasswordError.titleDefault, message: UpdatePasswordError.messageDefault)
                }
            })

        _ = self.awsUserPoolUpdatePassword.updatePasswordWithConfirmationCodeResult?
            .subscribe({ resultText in
                guard let elementContent = resultText.element?.forgotPasswordState else { return }

                switch elementContent {
                case .done:
                    self.showAlert(title: PasswordUpated.title, message: "")
                    self.transitionToLogin()
                default:
                    self.showAlert(title: UpdatePasswordError.titleDefault, message: UpdatePasswordError.messageDefault)
                }
            })
    }

    private func transitionToLogin() {
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
            self.performSegue(withIdentifier: AWSControllers.awsUpdatedPasswordSuccess, sender: self)
        }
//        DispatchQueue.main.async {
//            self.performSegue(withIdentifier: AWSControllers.awsUpdatedPasswordSuccess, sender: self)
//        }
    }

AWS 类

   internal func updatePasswordWithConfirmationCode(newPassword: String, confirmationCode: String) {

        guard let username = self.awsUserNameEmail else { return }

        let result = AWSMobileClient.default().rx.confirmForgotPassword(username: username, newPassword: newPassword, confirmationCode: confirmationCode)
            .materialize()

        result
            .compactMap { $0.element }
            .subscribe(onNext: { forgotPasswordResult in
                switch forgotPasswordResult.forgotPasswordState {
                case .done:
                    print("Password changed successfully")
                    self.userPasswordUpdateStatus = .passwordUpdateSuccessful
                default:
                    print("Error: Could not change password.")
                }
            })
            .disposed(by: disposeBag)
        updatePasswordWithConfirmationCodeError = result.compactMap { $0.error }
        updatePasswordWithConfirmationCodeResult = result.compactMap { $0.element }
    }
}

extension Reactive where Base: AWSMobileClient {

    func signIn(username: String, password: String) -> Observable<SignInResult> {
        return Observable.create { observer in
            self.base.signIn(username: username, password: password) { (signinResult, error) in
                if let signinResult = signinResult {
                    observer.onNext(signinResult)
                    observer.onCompleted()
                } else {
                    observer.onError(error ?? RxError.unknown)
                }
            }
            return Disposables.create()
        }
    }

    func confirmForgotPassword(username: String, newPassword: String, confirmationCode: String) -> Observable<ForgotPasswordResult> {
        return Observable.create { observer in
            self.base.confirmForgotPassword(username: username, newPassword: newPassword, confirmationCode: confirmationCode) { (confirmForgotPasswordResult, error) in
                if let confirmForgotPasswordResult = confirmForgotPasswordResult {
                    observer.onNext(confirmForgotPasswordResult)
                    observer.onCompleted()
                } else {
                    observer.onError(error ?? RxError.unknown)
                }
            }
            return Disposables.create()
        }
    }
}

segue 只能在密码更新成功后触发,密码更新成功由 print 语句确认。

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    我猜showAlert提供了一个UIAlertController,它是一种UIViewController...

    如果我的猜测是正确的,那么你的问题出在以下几行:

    self.showAlert(title: PasswordUpated.title, message: "")
    self.transitionToLogin()
    

    您正试图同时显示两个视图控制器。您需要等到警报完成呈现后再尝试呈现下一个视图控制器,或者更有可能等到警报完成被解除。

    (这不是一个 RxSwift 问题。)

    【讨论】:

    • 谢谢,我没有足够的IOS经验,需要学习RX Swift
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-17
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    • 1970-01-01
    相关资源
    最近更新 更多