2017-01-30 2 views
0

Я создал UITextfield, где я хочу добавить 4-значный пароль, но как только я войду в первую цифру, весь пробел исчезнет. как я могу сохранить следующие три буквы-заполнителя в UITextfield при вводе следующих букв пароля.При вводе текста в UITextField заполнитель должен исчезнуть с одной буквы в момент времени

вот мой скриншот:

enter image description here

ответ

0

Я хотел попробовать решение SeanLintern88, потому что это звучало как маленький вызов. И это в том случае, когда текстовое поле должно иметь пробелы между подчеркиванием.

textField.text = "_ _ _ _" 

Это решение, которое я пришел с, и в то время это было интересно писать, это то, что я не рекомендую использовать в реальных проектах. Лучше попробовать на 4 отдельных текстовых полях приближаются :)

extension ViewController: UITextFieldDelegate { 

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

     guard let text = textField.text else { return false } 

     var location = range.location 

     //is deleting 
     if string == "" { 

      guard let indexToReplace = text.index(text.startIndex, offsetBy: location, limitedBy: text.endIndex) else { 
       return false 
      } 

      let isCharDeleted = location % 2 == 0 
      //place " " or "_" depending on the position that was deleted 
      let stringToReplaceWith = isCharDeleted ? "_" : " " 
      let charachter = stringToReplaceWith[stringToReplaceWith.startIndex] 
      textField.text?.remove(at: indexToReplace) 
      textField.text?.insert(charachter, at: indexToReplace) 

      var newCursorPositionOffset = location 

      //deletetion occured on space " " 
      if !isCharDeleted { 

       guard let previousIndex = text.index(text.startIndex, offsetBy: location-1, limitedBy: text.endIndex) else { 
        return false 
       } 
       //delete the previous charachter 
       textField.text?.remove(at: previousIndex) 
       let dash = "_" 
       let char = dash[dash.startIndex] 

       textField.text?.insert(char, at: previousIndex) 

       //correct cursor position 
       newCursorPositionOffset -= 1 
      } 

      //move cursor position 
      let newPosition = textField.position(from: textField.beginningOfDocument, offset: newCursorPositionOffset) 
      textField.selectedTextRange = textField.textRange(from: newPosition!, to: newPosition!) 

      return false 
     } 

     //is typing 
     if range.location + 1 <= text.characters.count, 
      let end = text.index(text.startIndex, offsetBy: location+1, limitedBy: text.endIndex), 
      let start = text.index(text.startIndex, offsetBy: location, limitedBy: text.endIndex) { 
      textField.text = textField.text?.replacingOccurrences(of: "_", with: string, options: .caseInsensitive, range: Range(uncheckedBounds: (lower: start, upper: end))) 

      //correct the cursor position if placed on " " index 
      if range.location % 2 != 0 { 
       location -= 1 
      } 
     } 

     //skip " " and move cursor to the next "_" 
     if location+2 < text.characters.count { 
      let newPosition = textField.position(from: textField.beginningOfDocument, offset: location+2) 
      textField.selectedTextRange = textField.textRange(from: newPosition!, to: newPosition!) 

     } 

     return false 
    } 

    func textFieldDidBeginEditing(_ textField: UITextField) { 
     let newPosition = textField.beginningOfDocument 
     textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition) 


    } 
} 

PS: Возможно, это можно сделать короче с более выбором функций для строковых операций, но все еще довольно .. недружественным решением.

ЗАКЛЮЧЕНИЕ: НЕ ДЕЛАЙТЕ ЭТО НА ДОМА: D

+0

Спасибо за ваше решение. Он работал, но он слишком длинный. я могу сделать это немного коротким? –

1

Вместо использования placeHolder, просто переопределить метод shouldChangeCharactersInRange и добавить символы в строку, пока строка не имеет длину 4 символов, вы можете также использовать приписываемую строку, если вы хотите, чтобы _ отличался от точек.

+0

Выполнено путем замены заполнителя на «textField.text». но он не работает. Я хочу заменить эти 4 '_' текстом, поступающим с клавиатуры. Является ли это возможным? –

+0

Я думаю, что его, вероятно, лучше всего сделать заказным решением с 4 текстовыми полями – SeanLintern88

+0

Несколько текстовых полей могут быть проще в некотором роде, но не обязательно. Все, что вам нужно сделать, это следить за присваиваемой строкой для кода доступа, а затем заменять символы как их набранные. – PeejWeej

Смежные вопросы