jjzjj

iOS 自动填充假定密码前的字段是用户名

coder 2024-01-13 原文

自动填充的效果非常好,但我遇到过一种情况,它不是最佳的,而且我不知道有什么变通方法可能是一种正确的方法。

我有一个带有 2 个 UITextFields 的屏幕,第一个是 Amount,一个要转移给另一个人的货币值(value)。第二个字段是密码,用户需要重新输入密码才能完成交易。

第一个字段(金额)的内容类型设置为.unspecified,第二个字段(密码)设置为.password

当用户点击第二个字段时,自动填充精美地建议要使用的密码,但是一旦点击了正确的密码,iOS 会自动假定第一个字段(金额)是用户名,并用与所选相关联的用户名填充它帐户,覆盖用户之前输入的金额。

有没有办法强制仅自动填充密码?

最佳答案

今天我遇到了同样的问题,但方式不同。我的情况是在登录页面输入手机号码密码。 native 应用程序仅支持手机号码,而网络应用程序仅支持电子邮件。因此,当 iOS 自动填充起作用时,它会用 email 字段填充手机号码字段,这是 Not Acceptable 。

在玩了一段时间自动填充之后,我发现 UITextField 委托(delegate)的生命周期在自动填充的情况下有些不同。

当点击键盘顶部提供的自动填充时,UITextFieldDelegate 从头开始​​工作。 虽然键盘是打开的,但委托(delegate)方法从当前开始,调用顺序如下

  1. textField(_:shouldChangeCharactersIn:replacementString:)
  2. textFieldShouldEndEditing(_:)

此代表在键盘未关闭的情况下调用并再次出现。这是不寻常的。 textField(_:shouldChangeCharactersIn:replacementString:) 中返回 false 在这种情况下无效。

所以理论上我有机会在 textFieldShouldEndEditing 中编辑 mobile field。为此,我会跟踪自动填充开始之前出现的文本。所以取了两个变量如下

var previousText: String?
var nextText: String?

每当 UITextField 开始编辑时,我将其保存在 previousText 中,如下所示

public func textFieldDidBeginEditing(_ textField: UITextField) {
    previousText = textField.text
}

然后我跟踪 textField(_:shouldChangeCharactersIn:replacementString:) 中的变化,如下所示

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    nextText = self.getCompleteString(original: textField.text, replacingRange: range, withString: string)


    // YOU MAY RETURN `true` OR `false` BASED ON KEYBOARD TYPING, BUT RETURNING `false` IN CASE OF AUTOFILL HAS NO EFFECT. SO I ASSUME, YOU RETURN `true` ALWAYS.
    return true;
}

func getCompleteString(original: String?, replacingRange: NSRange, withString: String) -> String? {
    guard var originalText = original else {
        return nil
    }

    guard let range = Range<String.Index>.init(replacingRange, in: originalText) else {
        return nil
    }

    originalText.replaceSubrange(range, with: withString)

    return originalText
}

现在是最有趣的部分,检测自定义要求(在我的案例中检测可能的有效手机号码,而您的案例检测的是有效金额)

func textFieldDidEndEditing(_ textField: UITextField) {
    if textField == MY_MOBILE_TEXT_FIELD {
       if nextText.IS_POSSIBLE_VALID_MOBILE_NUMBER() { // my function to detect the possible valid mobile number
           textField.text = nextText
       } else {
           textField.text = previousText
       }
    }
}

它对我有用,希望对你也有用。

关于iOS 自动填充假定密码前的字段是用户名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52999137/

有关iOS 自动填充假定密码前的字段是用户名的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. 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%

  3. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

  4. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  5. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  6. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  7. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

    我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr

  8. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  9. ruby - 匹配大写字母并用后续字母填充,直到一定的字符串长度 - 2

    我有一个驼峰式字符串,例如:JustAString。我想按照以下规则形成长度为4的字符串:抓取所有大写字母;如果超过4个大写字母,只保留前4个;如果少于4个大写字母,则将最后大写字母后的字母大写并添加字母,直到长度变为4。以下是可能发生的3种情况:ThisIsMyString将产生TIMS(大写字母);ThisIsOneVeryLongString将产生TIOV(前4个大写字母);MyString将生成MSTR(大写字母+tr大写)。我设法用这个片段解决了前两种情况:str.scan(/[A-Z]/).first(4).join但是,我不太确定如何最好地修改上面的代码片段以处理最后一种

  10. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

随机推荐