it-swarm.com.ru

Как подсчитать UITextField в реальном времени при наборе текста (Swift)?

Я хотел бы посчитать символ, когда пользователь продолжает вводить UITextField с помощью Swift.

Изображение поля и метки:

enter image description here

Я уже разместил UITextField и UILabel, просто не нашел никакой информации о переполнении стека, также, если вы можете сделать это в UITextView Я также ценю это.

16
Farhad

Чтобы использовать функцию ниже, вам нужно ввести UITextFieldDelegate protocol в текстовое поле, которое вы хотите считать. Это вызывается каждый раз, когда изменяется текст UITextFields:

Объявление вашего класса должно выглядеть примерно так

class ViewController: UIViewController, UITextFieldDelegate

У вас должен быть @IBOutlet подобный этому

@IBOutlet var txtValue: UITextField

Установите для делегата UITextField значение self.

override func viewDidLoad() {
    super.viewDidLoad()
    txtValue.delegate = self                
}

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    let newLength = count(textField.text.utf16) + count(string.utf16) - range.length

    mylabel.text =  String(newLength) // Set value of the label
    // myCounter = newLength // Optional: Save this value
    // return newLength <= 25 // Optional: Set limits on input. 
    return true
}

Обратите внимание, что эта функция вызывается для всех UITextField, поэтому, если у вас есть несколько UITextField, вам нужно добавить логику, чтобы знать, кто вызывает эту функцию.

23
Icaro

Существует очень элегантное и аккуратное решение с использованием UITextFieldDelegate. Мое решение использует концепцию селекторов. В селекторе вы сообщаете своему компилятору, какую функцию/действие выполнять, когда происходит определенное событие. В этом случае - ввод в текстовое поле. Убедитесь, что вы установили делегата textField в раскадровке.

override func viewDidLoad() {
   super.viewDidLoad()
   yourTextField.addTarget(self, action: #selector(YourViewController.textFieldDidChange(_:)), forControlEvents: UIControlEvents.EditingChanged)
}

func textFieldDidChange(textField : UITextField){
   label.text = yourTextField.text?.characters.count
}
13
Yash Tamakuwala

Для нескольких UITextView

 enter image description here

class ViewController: UIViewController, UITextViewDelegate {

 @IBOutlet weak var ticketSummaryTV: UITextView!
 @IBOutlet weak var ticketDescriptionTV: UITextView!

 @IBOutlet weak var summaryCountLbl: UILabel!
 @IBOutlet weak var descriptionCountLbl: UILabel!

 override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.

    ticketSummaryTV.delegate = self
    ticketDescriptionTV.delegate = self

    self.updateCharacterCount()
 }

 func updateCharacterCount() {
    let summaryCount = self.ticketSummaryTV.text.characters.count
    let descriptionCount = self.ticketDescriptionTV.text.characters.count

    self.summaryCountLbl.text = "\((0) + summaryCount)/50"

    self.descriptionCountLbl.text = "\((0) + descriptionCount)/500"
 }

 func textViewDidChange(_ textView: UITextView) {
    self.updateCharacterCount()
 }


 func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool{
    if(textView == ticketSummaryTV){
       return textView.text.characters.count +  (text.characters.count - range.length) <= 50
    }else if(textView == ticketDescriptionTV){
        return textView.text.characters.count +  (text.characters.count - range.length) <= 500
    }
    return false
 }
}
6
MinnuKaAnae

Это позволит только ваш текстовое поле ввода 14 символов

class ViewController: UIViewController,UITextFieldDelegate {

@IBOutlet weak var textfield: UITextField!
@IBOutlet weak var label: UILabel!
override func viewDidLoad() {
    super.viewDidLoad()
    self.label.text = "14"
    self.textfield.delegate = self
}
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    let newLength = count(textField.text.utf16) + count(string.utf16) - range.length
    if(newLength <= 14){
        self.label.text = "\(14 - newLength)"
        return true
    }else{
        return false
    }
}
}

И скриншот

enter image description here

5
Leo
In Swift
viewDidLoad {
self.yourTextView.delegate = self
self.updateCharacterCount()
}

func updateCharacterCount() {
    self.yourLabel.text = "\((65) - self.yourTextView.text.characters.count)"  
}

func textViewDidChange(textView: UITextView) {
    self.updateCharacterCount()
}


func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {
    self.updateCharacterCount()
    return textView.text.characters.count +  (text.characters.count - range.length) <= 65
}
3
guest

Вот как вы можете сделать это в Swift 3/4.

Сначала убедитесь, что у вас установлен делегат textField в viewDidLoad.

yourTextField.delegate = self

Затем внедрите shouldChangeCharactersIn:

extension YourViewController: UITextFieldDelegate {
    func textField(_ textFieldToChange: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
      // limit to 4 characters
      let characterCountLimit = 4

      // We need to figure out how many characters would be in the string after the change happens
      let startingLength = textFieldToChange.text?.characters.count ?? 0
      let lengthToAdd = string.characters.count
      let lengthToReplace = range.length

      let newLength = startingLength + lengthToAdd - lengthToReplace

      return newLength <= characterCountLimit
    } 
}

Дополнительные детали здесь

0
Adrian

Swift 4 для UITextView изменить текстовое событие UITextViewDelegate

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {

}
0
mr.byte