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

问题描述 投票:3回答:1

自动填充工作非常好,但是我有一个场景,当它不是最优的时候,我不知道一个可能正确的方法。

我有一个带有2个UITextField的屏幕,第一个是Amount,一个货币值要转移给另一个人。第二个字段是密码,用户需要在事务完成之前重新输入密码。

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

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

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

ios ios11 autofill
1个回答
0
投票

今天我以不同的方式面对同样的问题。我的情况是将mobile numberpassword条目输入登录页面。原生应用仅支持手机号码,而网络应用仅支持email。因此,当iOS自动填充功能正在运行时,它会使用email字段填充移动号码字段,这是不可接受的。

在使用自动填充播放一段时间之后,我发现UITextField代表的生命周期在自动填充的情况下有所不同。

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

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

该代表在没有键盘消失的情况下调用并再次重新出现。这很不寻常。在这种情况下,在false返回textField(_:shouldChangeCharactersIn:replacementString:)没有任何影响。

所以理论上我有机会编辑mobile field中的textFieldShouldEndEditing。要做到这一点,我会跟踪自动填充开始之前出现的文本。所以拿了两个变量如下

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

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

© www.soinside.com 2019 - 2024. All rights reserved.