iOS 11 вимкнути параметр перегляду додаткових засобів автозаповнення пароля?


83

На даний момент я хотів би відмовитися від нової опції, яку надає iOS 11, тобто пропонувати паролі в додатку. Коли я запускаю програму на iOS 11, у верхній частині клавіатури з’являється опція автозаповнення, а текстове поле мого імені користувача та пароля навіть не відображається.

Отже, моє питання полягає в тому, як я можу вимкнути функцію автоматичного заповнення нового пароля разом, щоб клавіша на клавіатурі взагалі не відображалася, а загальна поведінка така ж, як до iOS 11?

введіть тут опис зображення


Спробуйте встановити для textContentTypeвластивості поля для імені користувача та пароля значення .textContentType- Це повинно повідомити iOS 11, що ваші поля не є полями для імені користувача / пароля (навіть якщо вони є) і запобігти відображенню подання аксесуарів; Щось на зразок `self.passwordField.textContentType = .textContentType`
Paulw11,

@zumzum ви отримали якесь рішення. поділіться, будь ласка,
Назмул Хасан

2
Це проблема і для мене. Функція автозаповнення з’являється в полях для реєстрації, що не є бажаним. Я хотів би, щоб вони просто були на полях для входу. Дивні речі.
Brad Root

2
Схоже, на iOS12 він з’являється знову. Як ти це там вирішив?
dollar2048

У iOS12 він все ще з'являється. Ви маєте ідею?
Емра Акгюль

Відповіді:


80

iOS 11 і 12 і 13 - Swift 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
Він доступний у форматі iOS 10, а не iOS 11.
мат,

@GalShahar Я не можу зараз його протестувати, але ось моя пропозиція: iOS 12 представляє нову, UITextContentTypeяка називається newPassword (див .: developer.apple.com/documentation/uikit/uitextcontenttype/… ). Спробуйте встановити тип вмісту текстових полів пароля для цього типу. Я думаю, тоді iOS не буде відображати подання додатків для автозаповнення, оскільки користувач змушений встановити новий пароль, а не використовувати / отримувати доступ до пароля, який був налаштований раніше, використовуючи режим автозаповнення аксесуарів. Зараз це лише теорія. Я не впевнений, чи це спрацює, але дайте мені знати, чи це так!
Баран Емре

Гаразд , хлопці забувають про те, що я написав про IOS 12. Налаштування UITextContentType для newPasswordне працює. Я спробував рішення @GalShahar, але мені це не сподобалось. Замість цього я встановлюю UITextContentTypeв oneTimeCode . Наразі це працює.
Баран Емре

Для iOS 12 мені isSecureTextEntryнасамперед потрібно було встановити значення false, а не встановити UITextContentTypeна oneTimeCode. Ми можемо встановити isSecureTextEntryвсе, що завгодно, як тільки вони почнуть вводити текстове поле.
da1

@ da1 Ми встановлюємо .isSecureTextEntryдо, trueперш ніж встановлювати textContentTypeна, .oneTimeCodeі це працює, як очікувалося. Я не знаю, як виглядає ваш код, але при ініціалізації текстового поля порядок налаштування його властивостей не важливий.
Баран Емре

16

iOS 12, здається, розпізнає паролі textFields також за isSecureTextEntryвластивістю, а не лише за textContentTypeвластивістю, тому зникнення цього виду аксесуарів насправді неможливе, якщо ви обидва не встановите для textContentType нічого та не видалите функцію secureEntry (і не спричините недолік безпеки у вашому додатку) потім заважає iOS 12 розпізнати textField як пароль textField і показати цей надокучливий вигляд аксесуарів.

У моєму випадку аксесуар спричинив помилку, через яку мій додаток не реагував на натискання (що також призвело до відхилення мого додатка в процесі перегляду програми). Тому мені довелося видалити цю функцію. Я не хотів відмовлятися від цієї функції безпеки, тому мені довелося вирішувати справи самостійно.

Ідея полягає в тому, щоб видалити функцію secureEntry, але додати її самостійно вручну. Це справді спрацювало:

введіть тут опис зображення


Це можна зробити так:

Стрімкий 4-х шлях:

По-перше, як тут відповіли, встановіть textContentTypeнічого:

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

Потім оголосіть змінну String, яка пізніше міститиме наш реальний вміст textField:

var passwordValue = ""

Додайте ціль до passwordTextField, яка буде викликатися щоразу, коли зміняться вміст textField:

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 змушує нас зламати, а не надавати більш чисті способи робити найосновніші речі. Це має бути прийнятою відповіддю.
sandpat

9

Функцію можна вимкнути, вказавши тип вмісту, який не є ні іменем користувача, ні паролем. Наприклад, якщо користувач повинен ввести адресу електронної пошти, ви можете використовувати

usernameTextField?.textContentType = .emailAddress

2
Цікаво, що у мене є поле адреси електронної пошти над полем пароля, і поле адреси електронної пошти пропонує автозаповнення.
Brad Root

1
@BradRoot також змініть поле для тексту пароля textContentype! якщо ваша електронна пошта вже збережена в брелоку, тоді вона буде відображати інформацію на швидкій панелі, тому краще скористатися .nickname або спробувати цей код, якщо # доступний (iOS 10.0, *) {self.passwordTextField.textContentType = UITextContentType.init (rawValue: " ")} else {// Запасна версія для попередніх версій}
Сахіл,

8

Ви можете додати розширення для UITextContentType, як це

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

після цього ви можете ним скористатися

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

6

У мене спрацював дуже простий підхід у ios11. Припустимо, ваші iboutlets - це ім'я користувача textxt і passwordtextfield. У функції viewDidLoad () вашого контролера перегляду, яка містить обидва зовнішніх, використовуйте наступний код

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

Після цього ви не побачите опцію аксесуара для автозаповнення, коли натискаєте на текстові поля.


6

у відповідь на відповідь @Gal Shahar.

iOS 12 розпізнає текстові поля паролів за isSecureTextEntryвластивістю, а не лише за textContentTypeвластивістю.

Спосіб обійти пропозицію автозаповнення.

  1. встановити isSecureTextEntry властивість як false.

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

ПРИМІТКА: - НЕ використовуйте shouldBeginEditingметод делегування UITextField, він все одно відображатиме пропозицію автоматичного заповнення. У НЕ використовувати textFieldDidChangeметод делегата UITextField він буде автоматично видаляти перший charachter як це станеться після того, як з'явиться перший charachter. І 'secureTextEntry' порожнє поле.


1
Це не тільки вирішує обговорювану проблему, але також вирішує проблему неправильного зчитування висоти клавіатури з UIKeyboardWillShowNotification під час натискання на поле пароля. Чудова відповідь.
ekashking

5

Завдання-C

if (@available(iOS 10, *)){
    self.tfEmail.textContentType = @"";
    self.tfPassword.textContentType = @"";
}

Це спрацювало для мене.


3

Автозаповнення за замовчуванням увімкнено для користувачів. iOS зберігає всі паролі в брелоку та робить їх доступними на клавіатурі у ваших програмах. UITextViewі UITextFieldавтоматично розглядається як пароль автозаповнення. Ви можете вимкнути, вказавши тип вмісту, який не є ні ім’ям користувача, ні паролем, але якщо інформація про тип вмісту вже зберігається в ланцюжку ключів, вона з’явиться на панелі швидкого пошуку. так що краще призначити порожнімUITextContentType тип, і він не відображатиме швидку панель.

Приклад:

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

3

Це працювало для iOS 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

Версія цілі C:

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. Текстове поле електронної пошти з автозаповненням iOS пропонує щось.
  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

З того, що я можу сказати, відповідь Бема не працює в iOS 12, а відповідь Гал Шахар не враховує деякі крайні випадки (наприклад, якщо користувач видаляє кілька символів одночасно). Я обійшов це, використовуючи IBAction, тим самим усунувши необхідність перевіряти наявність версії iOS взагалі. Я лише початківець, тож це може бути не найкращою чи найефективнішою відповіддю, але для мене це мало найбільший сенс:

Спочатку зніміть прапорець біля пункту «Захищений вхід тексту» в Розкадруванні або встановіть для нього значення «false» / ​​«NO» за допомогою коду для вашого пароля UITextField. Це не дозволить 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, ви не зможете його відключити, встановивши для autocorrectionType значення Ні, не впевнений, що Apple все ще вдосконалює цю функцію автозаповнення , зараз досить глючно.


1
Цей тип "відповіді" слід зарезервувати для розділу коментарів, оскільки він не дає фактичної відповіді або посилання на будь-яку довідкову документацію від Apple тощо. Ласкаво просимо до SO!
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все одно видає вам ту саму проблему.

Відповідь @Gal Shahar приємна, але все ще не ідеальна. Замаскований символ - це не те саме, що замаскований символ, який використовується в тексті безпечного входу від apple. Він повинен використовувати символ Unicode 'BLACK CIRCLE' (U + 25CF) https://www.fileformat.info/info/unicode/char/25cf/index.htm

Крім того, він не обробляє рух курсору. Це змінить положення курсору на кінець тексту при вставці тексту в середину. Це дасть вам неправильне значення під час вибору та заміни тексту.

Коли ви вирішите використовувати спеціальний isSecureEntryText, щоб уникнути пароля автозаповнення, ось код:

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

Swift 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, я не міг знайти жодного способу за допомогою власних методів, коли isSecureTextEntry встановлено в ТАК. Шлях Гал Шахар - це єдине рішення для відключення параметра автозаповнення пароля для перегляду додаткових пристроїв. Але це простіше зробити

ціль c

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

стрімкий

textField(_:shouldChangeCharactersIn:replacementString:)

делегат. І використовуйте такий простий код. Оголосіть змінну String, яка згодом міститиме наш реальний вміст textField, мій - 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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.