iOS 11 अक्षम पासवर्ड ऑटोफिल एक्सेसरी व्यू विकल्प?


83

अब तक मैं iOS 11 में दिए गए नए विकल्प से बाहर निकलना चाहूंगा, यानी ऐप में पासवर्ड सुझाना। जब मैं iOS 11 पर ऐप चलाता हूं तो मुझे कीबोर्ड के ऊपर ऑटोफिल विकल्प मिलता है और मेरा उपयोगकर्ता नाम और पासवर्ड टेक्स्टफील्ड भी दिखाई नहीं देता है।

तो, मेरा सवाल यह है कि मैं नए पासवर्ड ऑटोफिल फीचर को एक साथ कैसे निष्क्रिय कर सकता हूं ताकि कीबोर्ड पर कुंजी बिल्कुल दिखाई न दे और समग्र व्यवहार पूर्व iOS 11 जैसा ही हो?

यहाँ छवि विवरण दर्ज करें


उपयोगकर्ता नाम और पासवर्ड क्षेत्र के सेट करने का प्रयास textContentTypeकरने के लिए संपत्ति .textContentType- यह आईओएस 11 को बताना चाहिए कि अपने खेतों नहीं हैं नाम / पासवर्ड क्षेत्रों (भले ही वे कर रहे हैं) और गौण दृश्य से किया जा रहा दिखाया गया है को रोकने; `Self.passwordField.textContentType = .textContentType` की तरह कुछ
Paulw11

@ ज़ुमज़ुम आपको कोई समाधान नहीं मिला। कृपया शेयर करें
नजमुल हसन

2
यह मेरे लिए भी एक समस्या है। स्वत: पूर्ण सुविधा साइन अप करने के लिए फ़ील्ड पर दिखाई देती है, जो वांछित नहीं है। मैं उन्हें लॉग इन करने के लिए खेतों पर होना चाहता हूं। अजीब सामान।
ब्रैड रूट

2
IOS12 पर ऐसा लगता है कि यह फिर से दिखाई देता है। आपने इसे वहां कैसे हल किया?
डॉलर 2048

IOS12 में, यह अभी भी दिखाई देता है। क्या तुम्हारे पास कोई विचार है ?
Emrah Akgül

जवाबों:


80

iOS 11 और 12 और 13 - स्विफ्ट 4.2 और 5 (अपडेट किया गया):

if #available(iOS 12, *) {
    // iOS 12 & 13: Not the best solution, but it works.
    passwordTextField.textContentType = .oneTimeCode
} else {
    // iOS 11: Disables the autofill accessory view. 
    // For more information see the explanation below.
    emailTextField.textContentType = .init(rawValue: "")
    passwordTextField.textContentType = .init(rawValue: "")
}

iOS 11 स्पष्टीकरण:

सुनिश्चित करें कि आप अपनी सभी UITextFieldवस्तुओं को इस तरह सेटअप करते हैं।

यदि आपके पास उदाहरण के लिए एक UITextFieldवस्तु है जहां उपयोगकर्ता को अपना ईमेल पता दर्ज करना होगा और एक अन्य जहां उपयोगकर्ता को UITextContentType("")अपनी textContentTypeसंपत्ति के दोनों में अपना पासवर्ड असाइन करना होगा । अन्यथा यह काम नहीं करेगा और ऑटोफ़िल एक्सेसरी दृश्य अभी भी दिखाया जाएगा।


1
यह उपलब्ध प्रपत्र आईओएस 10 है, है ना आईओएस 11.
matm

@ गलशहर मैं अभी इसका परीक्षण नहीं कर सकता, लेकिन यहां मेरा सुझाव है: iOS 12 एक नया परिचय UITextContentTypeदेता है जिसे कहा जाता है newPassword (देखें: developer.apple.com/documentation/uikit/uitextcontenttype/… )। पासवर्ड पाठ फ़ील्ड सामग्री प्रकार इस प्रकार पर सेट करने का प्रयास करें। मुझे लगता है कि iOS तब ऑटोफिल एक्सेसरी दृश्य नहीं दिखाएगा, क्योंकि उपयोगकर्ता को एक नया पासवर्ड सेटअप करने के लिए मजबूर किया जाता है और ऑटोफिल एक्सेसरी व्यू का उपयोग करके पहले सेटअप किए गए / एक्सेस का उपयोग नहीं किया जाता है। अभी यह केवल सिद्धांत है। मुझे यकीन नहीं है कि यह काम करेगा, लेकिन मुझे बताएं कि क्या यह करता है!
बारां इमरे

ठीक है लोग मुझे के बारे में आईओएस 12. सेटिंग क्या लिखा है के बारे में भूल UITextContentType करने के लिए newPasswordकाम नहीं करता है। मैंने @ गलशहर के समाधान की कोशिश की, लेकिन मुझे यह पसंद नहीं आया। इसके बजाय मैं करने के UITextContentTypeलिए सेट कर रहा हूँ oneTimeCode । वह अभी के लिए काम करता है।
बारां इमरे

IOS 12 के लिए, मुझे सेट isSecureTextEntryकरने के अलावा पहले गलत पर सेट UITextContentTypeकरना था oneTimeCodeisSecureTextEntryपाठ क्षेत्र लिखना शुरू करने के बाद हम जो कुछ भी चाहते हैं उसे सेट कर सकते हैं।
दा .1

@ da1 हम सेटिंग .isSecureTextEntryकरने trueसे पहले सेट textContentTypeकर रहे हैं .oneTimeCodeऔर यह अपेक्षा के अनुरूप काम करता है। मुझे नहीं पता कि आपका कोड कैसा दिखता है, लेकिन जब टेक्स्ट फ़ील्ड को इनिशियलाइज़ करना होता है तो उसके गुण स्थापित करने का क्रम महत्वपूर्ण नहीं होता है।
बारां इमरे

16

iOS 12 पासवर्ड टेक्स्ट को पहचानता है, isSecureTextEntryसंपत्ति से भी और न केवल textContentTypeसंपत्ति से, इसलिए इस गौण दृश्य को गायब करना वास्तव में संभव नहीं है जब तक कि आप दोनों टेक्स्टकॉन्टेंट टाइप को कुछ भी नहीं सेट करते हैं, और सिक्योरइंटी फीचर को हटा दें (और अपने ऐप में सुरक्षा दोष पैदा करें) जो तब iOS 12 को टेक्स्टफिल्ड को पासवर्ड टेक्स्टफिल्ड के रूप में पहचानने से रोकता है और इस कष्टप्रद सहायक दृश्य को दिखाता है।

मेरे मामले में गौण एक बग का कारण बना, जिसने टैप किए जाने पर मेरे ऐप को गैर-जिम्मेदार बना दिया (जिसे ऐप समीक्षा में मेरे ऐप को अस्वीकार कर दिया गया था)। इसलिए मुझे यह फीचर हटाना पड़ा। मैं इस सुरक्षा सुविधा को छोड़ना नहीं चाहता था, इसलिए मुझे अपने आप से चीजों को हल करना था।

यह विचार सिक्योरइंट्री फीचर को हटाने का है लेकिन इसे स्वयं से जोड़ दें। इसने काम किया:

यहाँ छवि विवरण दर्ज करें


इसे इस तरह किया जा सकता है:

स्विफ्ट 4 रास्ता:

पहले, जैसा कि यहां बताया गया है, textContentTypeकुछ भी करने के लिए सेट :

if #available(iOS 10.0, *) {
    passwordText.textContentType = UITextContentType("")
    emailText.textContentType = UITextContentType("")
}

आगे, एक स्ट्रिंग वेरिएबल घोषित करें, जिसमें बाद में हमारी टेक्स्टफिल्ड वास्तविक सामग्री होगी:

var passwordValue = ""

प्रत्येक बार textField सामग्री में परिवर्तन करने के लिए कहा जाएगा, जो passwordTextField के लिए एक लक्ष्य जोड़ें:

passwordText.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)

अब यह है कि जादू क्या करेगा, पाठ प्रतिस्थापन को संभालने वाले फ़ंक्शन की घोषणा करें:

@objc func textFieldDidChange(_ textField: UITextField) {
    if textField.text!.count > 1 {
        // User did copy & paste
        if passwordValue.count == 0 { // Pasted into an empty textField
            passwordValue = String(textField.text!)
        } else { // Pasted to a non empty textField
            passwordValue += textField.text!.substring(from: passwordValue.count)
        }
    } else {
        // User did input by keypad
        if textField.text!.count > passwordValue.count { // Added chars
            passwordValue += String(textField.text!.last!)
        } else if textField.text!.count < passwordValue.count { // Removed chars
            passwordValue = String(passwordValue.dropLast())
        }
    }
    self.passwordText.text = String(repeating: "•", count: self.passwordText.text!.count)
}

अंत में, सेट करें TextField की भविष्य कहनेवाला पाठ को हटाने के autocorrectionTypeलिए .no:

passwordText.autocorrectionType = .no

यही है, passwordValueअपना लॉगिन करने के लिए उपयोग करें।

आशा है कि यह किसी की मदद करेगा।

अपडेट करें

यह पिछले मूल्यों को भी पकड़ता है, इसे पहले जोड़ना भूल गया।


2
उत्तम! अच्छा हैक दोस्त! शर्म की बात है कि iOS हमें सबसे बुनियादी चीजें करने के लिए क्लीनर तरीके प्रदान करने के बजाय हैक करता है। यह स्वीकृत उत्तर होना चाहिए।
चंदन

9

इस सुविधा को सामग्री प्रकार निर्दिष्ट करके अक्षम किया जा सकता है जो न तो उपयोगकर्ता नाम है और न ही पासवर्ड। उदाहरण के लिए, यदि उपयोगकर्ता को ईमेल पता दर्ज करना चाहिए, तो आप उपयोग कर सकते हैं

usernameTextField?.textContentType = .emailAddress

2
दिलचस्प बात यह है कि मेरे पास एक पासवर्ड फ़ील्ड के ऊपर एक ईमेल पता फ़ील्ड है, और ईमेल पता फ़ील्ड एक ऑटो-पूर्ण प्रदान करता है।
ब्रैड रूट

1
@BradRoot अपना पासवर्ड फ़ील्ड textContentype भी बदलें! यदि आपका ईमेल कीचेन में पहले से ही सेव है तो यह क्विकबार में जानकारी को दिखाएगा। उपयोगकर्ता के लिए बेहतर होगा। अगर आप #available (iOS 10.0, *) {self.passwordTextField.textContentType = UITextContentType.init (rawValue:) में इस कोड को आज़माएँगे। ")} और {// पुराने संस्करणों पर गिरावट}
साहिल

8

आप इस तरह UITextContentType के लिए एक्सटेंशन जोड़ सकते हैं

extension UITextContentType {
    public static let unspecified = UITextContentType("unspecified")
}

उसके बाद, आप इसका उपयोग कर सकते हैं

if #available(iOS 10.0, *) {
    passwordField.textContentType = .unspecified
}

7

@ गल शाहर जवाब में।

iOS 12 पासवर्ड टेक्स्टफिल्ड्स को isSecureTextEntryसंपत्ति से नहीं बल्कि संपत्ति से पहचानता है textContentType

ऑटो-भर के सुझाव को बायपास करने के लिए रास्ता।

  1. isSecureTextEntry झूठी संपत्ति सेट करें ।

self.passwordTextField.secureTextEntry = NO;

  1. एक UITextField डेलिगेट विधि जोड़ें और isSecureTextEntry संपत्ति को सक्षम करें ।
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    if (textField == self.passwordTextField && !self.passwordTextField.secureTextEntry) {
        self.passwordTextField.secureTextEntry = YES;
    }

    return YES;
}

ध्यान दें: - UITextField डेलिगेट विधि का उपयोग करें shouldBeginEditingयह अभी भी ऑटो-फिलिंग सुझाव दिखाएगा। करो नहीं उपयोग textFieldDidChangeयह के रूप में पहली चरित्र स्वत: नष्ट करेगा UITextField प्रतिनिधि विधि के बाद पहली चरित्र दिखाए जाने पर उसका क्या होगा। और 'SecureTextEntry' फ़ील्ड को खाली कर देगा।


1
यह न केवल एक चर्चा की गई समस्या को हल करता है, बल्कि यूआईकेबोर्डबोर्ड से एक कीबोर्ड ऊंचाई को गलत तरीके से फैलाने की समस्या को हल करता है जब शुरू में पासवर्ड फ़ील्ड पर टैप किया जाता है। बहुत बढ़िया जवाब।
ekashking

6

Ios11 में एक बहुत ही सरल दृष्टिकोण ने मेरे लिए काम किया। मान लीजिए कि आपके आइबोटलेट्स usernametextfield और passwordtextfield हैं। ViewDidLoad () में आपके viewcontroller के फ़ंक्शन जो दोनों आउटलेट को रखता है, निम्नलिखित कोड का उपयोग करता है

usernametextfield.textContentType = UITextContentType("")
passwordtextfield.textContentType = UITextContentType("")

इसके बाद जब आप अपने टेक्स्टफील्ड पर टैप करते हैं तो आपको ऑटोफिल एक्सेसरी ऑप्शन दिखाई देगा।



3

ऑटोफिल उपयोगकर्ताओं के लिए डिफ़ॉल्ट रूप से सक्षम है। iOS किचेन में सभी पासवर्ड सहेजता है और उन्हें आपकी ऐप्स में कीबोर्ड में उपलब्ध कराता है। UITextViewऔर UITextFieldस्वतः स्वतः पासवर्ड के लिए माना जाता है। आप ऐसी सामग्री प्रकार निर्दिष्ट करके अक्षम कर सकते हैं जो न तो उपयोगकर्ता नाम है और न ही पासवर्ड लेकिन यदि सामग्री प्रकार की जानकारी पहले से ही किचेन में संग्रहीत है तो यह त्वरित पट्टी में दिखाई देगी। खाली UITextContentTypeप्रकार निर्दिष्ट करना बेहतर है और यह क्विकबार नहीं दिखाएगा।

उदाहरण:

  if #available(iOS 10.0, *) {
  self.textField.textContentType = UITextContentType("")
  } else {
  // Fallback on earlier versions
 }

3

इसने 12 और 10 के लिए काम किया:

if (@available(iOS 10, *)) {
    passwordTextField.textContentType = UITextContentTypeStreetAddressLine2;
}

if (@available(iOS 12, *)) {
    passwordTextField.textContentType = UITextContentTypeOneTimeCode;
}

2

आप textContentTypeपासवर्ड पाठ क्षेत्र के लिए एक डमी निर्दिष्ट करके उपयोगकर्ता नाम / पासवर्ड कॉम्बो का पता लगा सकते हैं।

passwordFormField.textContentType = UITextContentType("dummy")

यह पासवर्ड फ़ील्ड और इसे भेजने से पहले ईमेल फ़ील्ड दोनों के लिए मुख्य प्रतीक को बंद कर देता है, और इस तरह आप पूर्वनिर्धारित मानों में से एक का उपयोग नहीं करते हैं और आप कीबोर्ड एक्सेसरी व्यू में असंबंधित सुझावों को दिखाने से बचते हैं।


क्या यह अभी भी आपके लिए नवीनतम iOS 12 बीटा पर काम करता है?
pfandrade

नहीं, यह नहीं है। IOS 12 पर यह एक नए पासवर्ड फ़ील्ड के रूप में इस क्षेत्र का पता लगाता है और एक नया मजबूत पासवर्ड (नया iOS 12 फीचर) सुझाता है। मैं वास्तव में इस व्यवहार को अपने मामले में चाहता हूं, इसलिए मैं नए iOS 12 newPasswordUITextContentType के साथ इस पासवर्ड फ़ील्ड को टैग कर रहा हूं । मैं नहीं जानता कि इस नए व्यवहार से कैसे बचें।
मिगुएल कैबेका

IOS 12 बीटा के लिए, यदि उपयोग किया जाए: textContentType = UITextContentType.oneTimeCode। फिर, इसमें कीबोर्ड पर कीचेन नहीं है। यह बिना किसी दुष्प्रभाव के मेरे लिए ठीक काम करता है। यदि आप .newPassword का उपयोग करते हैं, तो यह भी काम करता है, लेकिन फिर यह आपसे पासवर्ड समाप्त करने के बाद पासवर्ड सहेजने के लिए कहता है।
डैनियल जोन्स

2

उद्देश्य सी संस्करण:

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"10.0")) {
    self.passwordTextField.textContentType = @"";
    self.confirmPasswordTextField.textContentType = @"";
}

कहाँ पे

#define SYSTEM_VERSION_EQUAL_TO(v)                  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame)
#define SYSTEM_VERSION_GREATER_THAN(v)              ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN(v)                 ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v)     ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending)

2

आप यहां अलग-अलग उत्तरों की कोशिश कर सकते हैं जो यह निष्कर्ष निकाल सकते हैं कि गौण दृश्य को हटाना संभव है। लेकिन इससे कुछ कीड़े निकल जाते हैं।

आप शायद कस्टम कीबोर्ड लागू करने का प्रयास कर सकते हैं, केवल पासवर्ड फ़ील्ड के लिए। अपने टेक्स्टफ़ील्ड के लिए सुझावों को अक्षम करने का भी प्रयास करें, मुझे लगता है कि यह भी छुपाता है accessoryView

EDIT: अभी भी एक ही सवाल पर Apple मंचों पर कोई जवाब नहीं । इसके अलावा मुझे इस बारे में आधिकारिक UITextFieldदस्तावेज में कुछ भी नहीं मिला ।


2

इस विषय में पागल कर्मचारी हो रहे हैं। मैंने बिना iOS के मुझे पासवर्ड का प्रस्ताव दिया है, लेकिन मुझे केवल ईमेल के लिए एक ऑटोफिल दिया है। बस अगर किसी को इसकी जरूरत है। विभिन्न संयोजनों और विभिन्न प्रकार के textContentTypeबाद मैंने इसे वैसा बना दिया है जैसा मैं चाहता था।

  1. आईओएस ऑटोफिल प्रस्ताव के साथ ईमेल पाठ क्षेत्र कुछ हो।
  2. बिना iOS सिस्टम वाला पासवर्ड टेक्स्ट फ़ील्ड मुझे एक नया पासवर्ड प्रस्तावित करता है, लेकिन अगर मैं इसे ईमेल टेक्स्ट फ़ील्ड से चुनता हूं तो इसे पासवर्ड से भरना होगा।
  3. पासवर्ड पाठ क्षेत्र में सुरक्षित प्रवेश पाठ है।

और इस कोड के साथ इसने काम किया। कोई फर्क नहीं पड़ता कि आपके पास है emailया usernameयह आपको एक प्रस्ताव देगा कि आपको क्या चाहिए। इसलिए मैंने एक्सेसरी ऑटोफिल दृश्य को अक्षम कर दिया है और कीबोर्ड के टूलबार में केवल ऑटोफिल छोड़ दिया है।

self.passwordField.isSecureTextEntry = true

if #available(iOS 11.0, *) {
    self.emailField.textContentType = .username
    self.emailField.keyboardType = .emailAddress
}

if #available(iOS 12.0, *) {
    self.passwordField.textContentType = .password
    self.passwordField.keyboardType = .default
}

1

मैं जो बता सकता हूं, उसमें से बेम का उत्तर आईओएस 12 में काम नहीं करता है और गल शाहर का जवाब कुछ किनारे के मामलों के लिए नहीं है (उदाहरण के लिए, यदि उपयोगकर्ता एक बार में कई पात्रों को हटाता है)। मैंने एक IBAction का उपयोग करते हुए इस के आसपास काम किया, इस प्रकार पूरी तरह से iOS संस्करण की जांच करने की आवश्यकता को हटा दिया। मैं सिर्फ एक शुरुआत कर रहा हूं, इसलिए यह "सबसे अच्छा" उत्तर या सबसे कुशल नहीं हो सकता है, लेकिन यह मेरे लिए सबसे अधिक समझ में आता है:

सबसे पहले, स्टोरीबोर्ड में "सिक्योर टेक्स्ट एंट्री" को अनचेक करें या इसे अपने पासवर्ड UITextField के लिए कोड के माध्यम से "झूठा" / "NO" पर सेट करें। यह iOS को ऑटोफ़िल की कोशिश करने से रोकेगा।

फिर, अपने पासवर्ड UITextField को IBAction से लिंक करें। मेरा कहा जाता है:

  • संपादन शुरू हुआ
  • संपादन बदल गया
  • संपादन समाप्त हुआ

IBAction फ़ंक्शन जो मैंने लिखा था वह उपयोगकर्ता के शुरुआती पासवर्ड के बीच अंतर को निर्धारित करता है और पासवर्ड UITextField में इनपुट किया गया है और इस जानकारी के आधार पर एक नया पासवर्ड बनाता है:

class Login: UIViewController {
    var password = ""

    override func viewDidLoad() { super.viewDidLoad() }

    @IBAction func editPasswordField(_ sender: UITextField) {
        var input = Array(sender.text ?? "")
        var oldPassword = Array(password)
        var newPassword = Array("")

        //if character(s) are simply deleted from "passwordField" (not replaced or added to), "cursorPosition" is used to determine which corresponding character(s) need to also be removed from "oldPassword"
        //this is indicated by "input" comprising of only "•" (bullets) and being shorter in length than "oldPassword"
        var onlyBullets = true
        for char in input { if char != "•" { onlyBullets = false } }
        if onlyBullets && input.count < oldPassword.count {
            if let selectedRange = sender.selectedTextRange {
                let cursorPosition = sender.offset(from: sender.beginningOfDocument, to: selectedRange.start)
                let prefix = String(oldPassword.prefix(cursorPosition))
                let suffix = String(oldPassword.suffix(input.count - cursorPosition))
                input = Array(prefix + suffix)
            } else { input = Array("") }
        }

        //if no changes were made via input, input would comprise solely of a number of bullets equal to the length of "oldPassword"
        //therefore, the number of changes made to "oldPassword" via "input" can be measured with "bulletDifference" by calculating the number of characters in "input" that are NOT bullets
        var bulletDifference = oldPassword.count
        for char in input { if char == "•" { bulletDifference -= 1 } }

        //the only way "bulletDifference" can be less than 0 is if a user copy-pasted a bullet into "input", which cannot be allowed because it breaks this function
        //if a user pastes bullet(s) into "input", "input" is deleted
        //an edge case not accounted for is pasting a mix of characters and bullets (i.e. "ex•mple") when "oldPassword.count" exceeds the number of bullets in the mixed input, but this does not cause crashes and therefore is not worth preventing
        if bulletDifference < 0 {
            bulletDifference = oldPassword.count
            input = Array("")
        }

        //"bulletDifference" is used to remove every character from "oldPassword" that corresponds with a character in "input" that has been changed
        //a changed character in "input" is indicated by the fact that it is not a bullet
        //once "bulletDifference" equals the number of bullets deleted, this loop ends
        var bulletsDeleted = 0
        for i in 0..<input.count {
            if bulletsDeleted == bulletDifference { break }
            if input[i] != "•" {
                oldPassword.remove(at: i - bulletsDeleted)
                bulletsDeleted += 1
            }
        }

        //what remains of "oldPassword" is used to substitute bullets in "input" for appropriate characters to create "newPassword"
        //for example, if "oldPassword" is "AcbDE" and "input" is "•bc••", then "oldPassword" will get truncated to "ADE" and "newPassword" will equal "A" + "bc" + "DE", or "AbcDE"
        var i = 0
        for char in input {
            if char == "•" {
                newPassword.append(oldPassword[i])
                i += 1
            } else { newPassword.append(char) }
        }
        password = String(newPassword)

        //"passwordField.text" is then converted into a string of bullets equal to the length of the new password to ensure password security in the UI
        sender.text = String(repeating: "•", count: password.count)
    }
}

रचनात्मक आलोचना की सराहना की है!


1

ठीक है, मैं पुष्टि कर सकता हूं कि मेरे पास निम्नलिखित मुद्दों पर iOS 14 में कोई समस्या नहीं है:

// once this property is declared, textField.keyboardType does
// not seem to have any effect in showing the autofill

textField.textContentType = UITextContentType.oneTimeCode
textField.keyboardType = UIKeyboardType.emailAddress

UITextField.textContentType


0
self.passwordTextField.autocorrectionType = NO;

यह काम करने के लिए नहीं लगता है, चाबी का निशान अभी भी वहाँ है,

self.passwordTextField.textContentType = UITextContentTypeName;

ऊपर दिया गया कोड काम करता है, लेकिन यदि उपयोगकर्ता अपना Apple ID खाता सेट करते हैं, तो, Apple आईडी का नाम उस कीबोर्ड पर प्रदर्शित किया जाएगा जिसे आप स्वतः निरूपण द्वारा अक्षम नहीं कर सकते। , यह अभी काफी छोटी है।


1
इस प्रकार के 'उत्तर' को टिप्पणी अनुभाग के लिए आरक्षित किया जाना चाहिए, क्योंकि यह ऐप्पल आदि से किसी भी संदर्भ प्रलेखन के लिए वास्तविक उत्तर या लिंक नहीं देता है, हालांकि एसओ में आपका स्वागत है!
stktrc

अभी तक कोई हल नहीं। यहां सूचीबद्ध कुछ भी मेरे लिए अच्छी तरह से काम नहीं किया।
zumzum

0

यह मेरे लिए काम किया:

नोट: इस कोड को पासवर्ड, पासवर्ड की पुष्टि (यदि लागू हो), और ईमेल टेक्स्टफील्ड पर डालने का प्रयास करें। मैं इसे ईमेल टेक्स्टफील्ड पर नहीं डाल रहा था और यह अभी भी दो पासवर्ड फ़ील्ड के लिए पॉप अप कर रहा था।

if #available(iOS 12, *) {
     // iOS 12: Not the best solution, but it works.
     cell.textField.textContentType = .oneTimeCode
} else {
     // iOS 11: Disables the autofill accessory view.
     cell.textField.textContentType = .init(rawValue: "")
}

1
यह बेम के उत्तर के समान है।
एरिक आया

0

मैं करने के लिए रूप में सभी UITextField textContentType सेट लगता है UITextContentType("")या .oneTimeCodeएक साफ समाधान नहीं है। सक्षम / अक्षम करें isSecureTextEntryअभी भी आपको वही मुद्दा दिया गया है।

@ गल शाहर का जवाब अच्छा है लेकिन यह अभी भी सही नहीं है। नकाबपोश चार नकाबपोश के समान नहीं है जो सेब से सुरक्षित प्रवेश पाठ में उपयोग किया जाता है। इसे यूनिकोड कैरेक्टर 'BLACK CIRCLE' (U + 25CF) https://www.fileformat.info/info/unicode/char/25cf/index.htm का उपयोग करना चाहिए

इसके अलावा, यह कर्सर संचलन को संभाल नहीं रहा है। बीच में टेक्स्ट डालने पर यह कर्सर की स्थिति को टेक्स्ट के अंत में बदल देगा। पाठ का चयन करने और बदलने के दौरान यह आपको गलत मान देगा।

जब आप ऑटोफ़िल पासवर्ड से बचने के लिए कस्टम isSecureEntryText का उपयोग करने का निर्णय लेते हैं, तो यहां कोड है:

स्विफ्ट 5 (सरल संस्करण)

@IBOutlet weak var passwordTextField: UITextField!

var maskedPasswordChar: String = "●"
var passwordText: String = ""
var isSecureTextEntry: Bool = true {
    didSet {
        let selectedTextRange = passwordTextField.selectedTextRange
        passwordTextField.text = isSecureTextEntry ? String(repeating: maskedPasswordChar, count: passwordText.count) : passwordText
        passwordTextField.selectedTextRange = selectedTextRange
    }
}

//this is UITextFieldDelegate
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

    if textField == passwordTextField {
        //update password string
        if let swiftRange = Range(range, in: passwordText) {
            passwordText = passwordText.replacingCharacters(in: swiftRange, with: string)
        } else {
            passwordText = string
        }

        //replace textField text with masked password char
        textField.text =  isSecureTextEntry ? String(repeating: maskedPasswordChar, count: passwordText.count) : passwordText

        //handle cursor movement
        if let newPosition = textField.position(from: textField.beginningOfDocument, offset: range.location + string.utf16.count) {
            textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition)
        }
        return false
    }
    return true
}

स्विफ्ट 5 (अंतिम चार एनीमेशन प्राप्त करने के साथ पूर्ण संस्करण)

private struct Constants {
    static let SecuringLastCharPasswordDelay = 1.5
}

@IBOutlet weak var passwordTextField: UITextField!

private var secureTextAnimationQueue: [String] = []

var maskedPasswordChar: String = "●"
var passwordText: String = ""
var isSecureTextEntry: Bool = true {
    didSet {
        secureTextAnimationQueue.removeAll()
        let selectedTextRange = passwordTextField.selectedTextRange
        passwordTextField.text = isSecureTextEntry ? String(repeating: maskedPasswordChar, count: passwordText.count) : passwordText
        passwordTextField.selectedTextRange = selectedTextRange
    }
}

//this is UITextFieldDelegate
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

    if textField == passwordTextField {
        //update password string
        if let swiftRange = Range(range, in: passwordText) {
            passwordText = passwordText.replacingCharacters(in: swiftRange, with: string)
        } else {
            passwordText = string
        }

        //replace textField text with masked password char
        updateTextFieldString(textField, shouldChangeCharactersIn: range, replacementString: string)

        //handle cursor movement
        if let newPosition = textField.position(from: textField.beginningOfDocument, offset: range.location + string.utf16.count) {
            textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition)
        }
        return false
    }
    return true
}

private func updateTextFieldString(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) {
    if isSecureTextEntry {
        if string.count == .one, let text = textField.text {
            let maskedText = String(repeating: maskedPasswordChar, count: text.count)

            var newMaskedText = String()
            if let swiftRange = Range(range, in: maskedText) {
                newMaskedText = maskedText.replacingCharacters(in: swiftRange, with: string)
            } else {
                newMaskedText = text + maskedText
            }

            textField.text = newMaskedText
            secureTextAnimationQueue.append(string)
            asyncWorker.asyncAfter(deadline: .now() + Constants.SecuringLastCharPasswordDelay) { [weak self] in
                self?.securingLastPasswordChar()
            }
        } else {
            secureTextAnimationQueue.removeAll()
            textField.text = String(repeating: maskedPasswordChar, count: passwordText.count)
        }
    } else {
        textField.text = passwordText
    }
}

private func securingLastPasswordChar() {
    guard secureTextAnimationQueue.count > .zero, isSecureTextEntry else { return }
    secureTextAnimationQueue.removeFirst()
    if secureTextAnimationQueue.count == .zero {
        let selectedTextRange = passwordTextField.selectedTextRange
        passwordTextField.text = String(repeating: maskedPasswordChar, count: passwordText.count)
        passwordTextField.selectedTextRange = selectedTextRange
    }
}

0

यहाँ छवि विवरण दर्ज करें

मैंने स्क्रीनशॉट संलग्न किया है। आप स्टोरीबोर्ड में सामग्री प्रकार को उपयोगकर्ता नाम के रूप में बदल सकते हैं या आप प्रोग्राम कर सकते हैं। आप UITextfield के लिए एक्सटेंशन बना सकते हैं।

func diableAutofill() {
        self.autocorrectionType = .no
        if #available(iOS 11.0, *) {
            self.textContentType = .username
        } else {
            self.textContentType = .init("")
        }
    }

0

Apple के लिए धन्यवाद, मैं किसी भी तरह से देशी तरीकों के साथ नहीं मिल सका जब isececureTextEntry YES में आ गया। Gal Shahar का तरीका पासवर्ड ऑटोफिल एक्सेसरी व्यू विकल्प को अक्षम करने का एकमात्र समाधान है। लेकिन इसके साथ करना ज्यादा आसान है

उद्देश्य सी

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string

तीव्र

textField(_:shouldChangeCharactersIn:replacementString:)

प्रतिनिधि। और इस तरह सिंपल कोड का उपयोग करें। एक स्ट्रिंग चर घोषित करें, जिसमें बाद में हमारी पाठ्य सामग्री असली होगी, मेरा pswd है।

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
    {
        //Thanks iOS13!!!
        if(!_pswd)
        {
            _pswd = @"";
        }
        _pswd = [_pswd stringByReplacingCharactersInRange:range withString:string];

        if (!buttonShowPassword.selected)
        {
            textField.text = [@"" stringByPaddingToLength:_pswd.length withString: @"•" startingAtIndex:0];
        }
        else
        {
            textField.text = _pswd;
        }
        return NO;
    }

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.