gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:28:32 25 4
gpt4 key购买 nike

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

我有一个带有 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com