我有一个NSSecureTextField字段在我的MacOS应用程序。我想禁用密码自动填写按钮从上来("密码…"按钮)。我看过一些关于在iOS上这么做的文章,但还没在Mac OS上看到。我该怎么做呢?由于
可以禁用密码自动填充,因为当前默认行为是在窗口中的第一个NSSecureTextField
上显示自动填充按钮。但这是一个拼凑。
我发现,如果您在关注的字段上方创建一个虚拟NSSecureTextField
,并将其隐藏在另一个预先存在的字段后面,您可以避免出现自动填充按钮。我用NSTextContentTypeOneTimeCode
设置这个虚拟字段。
注意,这只适用于虚拟NSSecureTextField
在关键视图循环中,因此隐藏它或设置refusesFirstResponder
没有帮助。这也意味着您需要处理终端用户从一个字段切换到另一个字段的情况,以便跳过虚拟字段。
当且仅当焦点在虚拟字段上时,可以通过检测前一个字段(controlTextDidEndEditing:
)的编辑完成并更改焦点来实现焦点跳过。
对于一些可以简单地用适当的NSTextContentType
解决的事情来说,这有点复杂!
是的,Michael Rourke是对的——在cocoa应用程序中使用自动填充会导致很多问题。例如,如果我开发一个带有本机注册屏幕的应用程序,用户将看到自动填充提供程序提出现有密码而不是提供新密码。这只是隐藏提供者的一种方法——oneTimeCode。但是用户可以得到一个空的透明弹出框(我真的认为我们可以找到隐藏它的变通方法,例如使用window.makeFirstResponder(textField)),这不是最大的问题。
对于我来说,最大的问题是无法将新凭据保存到icloud钥匙链并将其链接到您的web域(但我可能错了:))。在应用程序中创建一个密码,而登录时却没有后续使用的可能性,这是很奇怪的。
我想这是为什么苹果没有添加新密码的原因-可能是他们在使用可可自动填充为钥匙链创建新记录时遇到了一些奇怪的问题。
在Zeplin应用程序的人使用这样的解决方案作为本地登录和网站注册-所以safari创建一个记录在钥匙链,应用程序使用自动填充登录。
我很确定他们会在下一个版本的mac os中添加一个新密码,但如果他们完全完成这个功能然后发布它会更好。因为之前的版本(比如现在的Big Sur)对它的支持很差,所以下一个版本的Mac OS就不能正常使用它了。
PS如果用户有很多来自当前域的密码,并且他快速地输入了一个密码,那么很有可能与提供者(弹出式)紧急断开连接。
经过一些反向工程,我发现以下子类将禁用自动填充行为:
@interface NoAutofillSecureTextField : NSSecureTextField
@end
@implementation NoAutofillSecureTextField
- (BOOL)_isPasswordAutofillEnabled
{
return NO;
}
@end
注意:这个答案适用于iOS和UIKit,而不是macOS
我同意Alexander的观点,请不要这样做:)
但是如果你必须,它会停止提供自动填充设置字段UITextContentType
值属性为.newPassword
或.oneTimeCode
,如这里所述。