web-dev-qa-db-ja.com

入力中にライブUITextFieldカウントを行う方法(Swift)

ユーザーがSwiftでITextFieldと入力し続けたときに文字をカウントしたいと思います。

フィールドとラベルの画像:

enter image description here

すでにUITextFieldとUILabelを配置しましたが、スタックオーバーフローに関する情報が見つかりませんでした。また、ITextViewでできる場合もあります。

20
Farhad

以下の関数を使用するには、カウントするテキストフィールドにUITextFieldDelegate protocolを実装する必要があります。これは、UITextFieldsテキストが変更されるたびに呼び出されます。

クラス宣言は次のようになります

class ViewController: UIViewController, UITextFieldDelegate

これに似た@IBOutletが必要です

@IBOutlet var txtValue: UITextField

UITextField sデリゲートを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
}

この関数はすべてのUITextFieldsで呼び出されるため、複数のUITextFieldsがある場合は、この関数を呼び出していることを知るロジックを追加する必要があります。

24
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
}
16
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
 }
}
7
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

UITextViewテキスト変更イベントUITextViewDelegateのSwift 4

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

}
0
mr.byte

Swift 5.1

viewControllerデリゲートを追加

_final class CreditCardViewController : BaseViewController , UITextFieldDelegate {

    @IBOutlet var cvvTextField: UITextField!
_

viewDidLoad()を追加

_cvvTextField.delegate = self
_

そして、デリゲート関数を追加します。

_func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        if(textField == cvvTextField){
            let characterCountLimit = 3
            let startingLength = textField.text?.count ?? 0
            let lengthToAdd = string.count
            let lengthToReplace = range.length

            let newLength = startingLength + lengthToAdd - lengthToReplace

            return newLength <= characterCountLimit
        }

        return true
    }
_
0
ikbal