草庐IT

swift - 登录失败导致未编码的转场?

coder 2023-09-06 原文

我设置了一个应用程序,用户可以在其中登录和注销(这是通过 heroku 托管的 Parse-server 处理的,带有 Parse 框架)。

要登录,用户输入凭据,如果服务器验证了它们,segue 会将它们移动到另一个 View Controller 。注销会将用户从应用程序中退出,然后返回到登录屏幕。这些工作正常。

如果初始登录凭据不正确,则会显示一条警报,提示用户重试,并且用户未登录(显然)并留在登录屏幕上。

但是,如果用户登录、注销,然后输入不正确的凭据(按此顺序,没有关闭模拟器),就会出现问题。不正确的凭据会弹出提示警报;点击“确定”关闭警报,用户未登录,但 View 被转到注销屏幕(注销按钮在哪里......这应该只有登录用户可以访问)。不存在将用户从登录直接移动到注销屏幕的 segue segue(无论是编码的还是在 Storyboard上)。

因为许多操作需要用户 ID,所以没有任何操作有效,而且没有任何操作,因为没有人登录。我不知道为什么不正确的登录会以这种方式移动 VC,因为不存在可以做到这一点的 segue。有一个反向移动(注销时),但没有朝那个方向移动。

有人有什么想法吗?下面是相关的登录代码。

@IBAction func signInTapped(_ sender: UIButton) {
        UIApplication.shared.beginIgnoringInteractionEvents()

        PFUser.logInWithUsername(inBackground: userNameTextField.text!, password: passwordTextField.text!, block: { (user, error) in
            if user != nil{

                self.performSegue(withIdentifier: "signInSegue", sender: self)//if the sign in works    
            } else{

                if let errorString = (error! as NSError).userInfo["error"] as? String{

                    let errorMessage = errorString

                    self.displayAlert("Failed login", message: errorMessage)//this is the code run when the login fails, yet it somehow can sometimes segue to the other viewcontroller
                }   
            }
        })
}

这是正在发生的事情的分步示意图。

  1. 用户从登录页面开始并输入他/她的凭据
  2. 这会将用户(现在已登录)转到 tabbarViewController
  3. 然后他们导航到另一个选项卡,并且有一个退出按钮
  4. 按下注销按钮会导致出现警报,点击是会将用户(现在已注销)转到原始屏幕
  5. 用户现在位于登录屏幕。输入错误的信息会发出警报
  6. 出现警报。点击是关闭警报应该让用户留在登录屏幕上。但是,再次立即转到注销屏幕......这既没有编码也没有在 Storyboard 中手动设置

我认为可能相关的随机事件: 打开应用程序时,会在第一个 VC(登录屏幕)的 viewDidAppear 上调用一个初始 segue。它检查是否有用户登录,通过

if PFUser.current().username? != nil {
      //perform segue
}

此 segue 将他们带到选项卡栏上的 map 部分(而不是出现问题时出现的注销页面)。

编辑:在出现“segue”到注销屏幕时,登录屏幕下降(就像字面意思一样,向下落在屏幕上直到它看不见,然后注销屏幕是可见的,这不是任何 segues 中的方式应用程序功能)。此外,只有 viewDidAppear 代码在发生此转换时被调用,不是 viewDidLoad 代码。

编辑 2:我认为问题与 View 层次结构有关。这是登录功能的代码:

PFUser.logInWithUsername(inBackground: userNameTextField.text!, password: passwordTextField.text!, block: { (user, error) in

            if user?.username != nil{ 
                self.performSegue(withIdentifier: "signInSegue", sender: self) 
            } else{ //if everything in this code block is commented, the issue does not occur
                if let errorString = (error! as NSError).userInfo["error"] as? String{
                    let errorMessage = errorString
                    self.displayAlert("Failed login", message: errorMessage)
                }  
            }
        })

如果我注释掉 if 语句的 else 部分中的所有内容,问题就不会发生。我认为正在发生的是显示警报,然后点击“确定”关闭警报并将应用程序发送回最顶层(也许我对它的调用是错误的)viewController,这在某种程度上是注销 VC .我认为解决它的一个好方法是将 self.present(homescreenVC) 或类似的东西添加到 else 代码中,但我不知道如何这样做。

最佳答案

@IBAction func signInTapped(_ sender: UIButton) {
    UIApplication.shared.beginIgnoringInteractionEvents()

    PFUser.logInWithUsername(inBackground: userNameTextField.text!, password: passwordTextField.text!, block: { (user, error) in
        if error != nil {
             if let errorString = (error! as NSError).userInfo["error"] as? String{

                let errorMessage = errorString

                self.displayAlert("Failed login", message: errorMessage)
               }
        } 
        else {
            self.performSegue(withIdentifier: "signInSegue", sender: self)

            }   
        })
    }

关于swift - 登录失败导致未编码的转场?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41458601/

有关swift - 登录失败导致未编码的转场?的更多相关文章

  1. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  2. ruby - 用逗号、双引号和编码解析 csv - 2

    我正在使用ruby​​1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\

  3. ruby - 即使失败也继续进行多主机测试 - 2

    我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r

  4. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  5. ruby-on-rails - 创建 ruby​​ 数据库时惰性符号绑定(bind)失败 - 2

    我正在尝试在Rails上安装ruby​​,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf

  6. ruby - 正则表达式在哪个位置失败? - 2

    我需要一个非常简单的字符串验证器来显示第一个符号与所需格式不对应的位置。我想使用正则表达式,但在这种情况下,我必须找到与表达式相对应的字符串停止的位置,但我找不到可以做到这一点的方法。(这一定是一种相当简单的方法……也许没有?)例如,如果我有正则表达式:/^Q+E+R+$/带字符串:"QQQQEEE2ER"期望的结果应该是7 最佳答案 一个想法:你可以做的是标记你的模式并用可选的嵌套捕获组编写它:^(Q+(E+(R+($)?)?)?)?然后你只需要计算你获得的捕获组的数量就可以知道正则表达式引擎在模式中停止的位置,你可以确定匹配结束

  7. ruby - 使用 rbenv 和 ruby​​-build 构建 ruby​​ 失败,出现 undefined symbol : SSLv2_method - 2

    我正在尝试在配备ARMv7处理器的SynologyDS215j上安装ruby​​2.2.4或2.3.0。我用了optware-ng安装gcc、make、openssl、openssl-dev和zlib。我根据README中的说明安装了rbenv(版本1.0.0-19-g29b4da7)和ruby​​-build插件。.这些是随optware-ng安装的软件包及其版本binutils-2.25.1-1gcc-5.3.0-6gconv-modules-2.21-3glibc-opt-2.21-4libc-dev-2.21-1libgmp-6.0.0a-1libmpc-1.0.2-1libm

  8. Ruby 守护进程导致 ActiveRecord 记录器 IOError - 2

    我目前正在用Ruby编写一个项目,它使用ActiveRecordgem进行数据库交互,我正在尝试使用ActiveRecord::Base.logger记录所有数据库事件具有以下代码的属性ActiveRecord::Base.logger=Logger.new(File.open('logs/database.log','a'))这适用于迁移等(出于某种原因似乎需要启用日志记录,因为它在禁用时会出现NilClass错误)但是当我尝试运行包含调用ActiveRecord对象的线程守护程序的项目时脚本失败并出现以下错误/System/Library/Frameworks/Ruby.frame

  9. ruby-on-rails - 有没有一种工具可以在编码时自动保存对文件的增量更改? - 2

    我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功

  10. ruby-on-rails - Ruby 的 'open_uri' 是否在读取或失败后可靠地关闭套接字? - 2

    一段时间以来,我一直在使用open_uri下拉ftp路径作为数据源,但突然发现我几乎连续不断地收到“530抱歉,允许的最大客户端数(95)已经连接。”我不确定我的代码是否有问题,或者是否是其他人在访问服务器,不幸的是,我无法真正确定谁有问题。本质上,我正在读取FTPURI:defself.read_uri(uri)beginuri=open(uri).readuri=="Error"?nil:urirescueOpenURI::HTTPErrornilendend我猜我需要在这里添加一些额外的错误处理代码...我想确保我采取一切预防措施来关闭所有连接,这样我的连接就不是问题所在,但是我

随机推荐