programing

UI 텍스트 필드가 변경되는 경우 어떻게 확인합니까?

skycolor 2023. 5. 22. 20:53
반응형

UI 텍스트 필드가 변경되는 경우 어떻게 확인합니까?

textView에 사용되는 기능과 동일한 텍스트 필드가 언제 변경되는지 확인하려고 합니다.textViewDidChange지금까지 저는 이것을 해왔습니다.

  func textFieldDidBeginEditing(textField: UITextField) {
        if self.status.text == "" && self.username.text == "" {
            self.topRightButton.enabled = false
        } else {   
            self.topRightButton.enabled = true
        }
    }

어떤 종류의 것이 효과가 있지만,topRightButton텍스트 필드를 누르면 바로 활성화됩니다. 텍스트를 실제로 입력한 경우에만 활성화하시겠습니까?

스위프트

스위프트 4.2

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

그리고.

@objc func textFieldDidChange(_ textField: UITextField) {

}

SWIFT 3 & Swift 4.1

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

그리고.

func textFieldDidChange(_ textField: UITextField) {

}

SWIFT 2.2

textField.addTarget(self, action: #selector(ViewController.textFieldDidChange(_:)), forControlEvents: UIControlEvents.EditingChanged)

그리고.

func textFieldDidChange(textField: UITextField) {
    //your code
}

목표-C

[textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];

및 textFieldDidChange 메서드는

-(void)textFieldDidChange :(UITextField *) textField{
    //your code
}

인터페이스 작성기에서 이 연결을 만들 수 있습니다.

  1. 스토리보드에서 화면 맨 위에 있는 보조 편집기(가운데 두 원)를 클릭합니다.보조 편집기가 선택됨

  2. Ctrl + 인터페이스 작성기의 텍스트 필드를 클릭합니다.

  3. EditingChanged(편집 변경)에서 Assistant 뷰의 뷰 컨트롤러 클래스 내부로 끕니다.연결하기

  4. 함수 이름을 지정하고(예: textDidChange) 연결을 클릭합니다.명명 함수

스위프트 5.0

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

및 처리 방법:

@objc func textFieldDidChange(_ textField: UITextField) {

}

스위프트 4.0

textField.addTarget(self, action: #selector(ViewController.textFieldDidChange(_:)),
                          for: UIControlEvents.editingChanged)

및 처리 방법:

@objc func textFieldDidChange(_ textField: UITextField) {

}

스위프트 3.0

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

및 처리 방법:

func textFieldDidChange(textField: UITextField) { 

}

지금까지 제가 처리한 방식: in.UITextFieldDelegate

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool
{
    // text hasn't changed yet, you have to compute the text AFTER the edit yourself
    let updatedString = (textField.text as NSString?)?.stringByReplacingCharactersInRange(range, withString: string)

    // do whatever you need with this updated string (your code)


    // always return true so that changes propagate
    return true
}

스위프트 4 버전

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    let updatedString = (textField.text as NSString?)?.replacingCharacters(in: range, with: string)
    return true
}

스위프트 3

 textField.addTarget(self, action: #selector(ViewController.textFieldDidChange(sender:)), for: UIControlEvents.editingChanged)

textField(_:shouldChangeCharactersIn:replacementString:)는 Xcode 8, Swift 3에서 모든 키 누르기를 확인할 때 저를 위해 작동했습니다.

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

    // Whatever code you want to run here.
    // Keep in mind that the textfield hasn't yet been updated,
    // so use 'string' instead of 'textField.text' if you want to
    // access the string the textfield will have after a user presses a key

    var statusText = self.status.text
    var usernameText = self.username.text

    switch textField{
    case self.status:
        statusText = string
    case self.username:
        usernameText = string
    default:
        break
    }

    if statusText == "" && usernameText == "" {
        self.topRightButton.enabled = false
    } else {   
        self.topRightButton.enabled = true
    }

    //Return false if you don't want the textfield to be updated
    return true
}

Swift 3.0.1+ (다른 Swift 3.0 답변 중 일부는 최신이 아님)

textField.addTarget(self, action: #selector(ViewController.textFieldDidChange(_:)),
                          for: UIControlEvents.editingChanged)

func textFieldDidChange(_ textField: UITextField) {

}

스위프트 4

UITextFieldDelegate를 준수합니다.

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    // figure out what the new string will be after the pending edit
    let updatedString = (textField.text as NSString?)?.replacingCharacters(in: range, with: string)

    // Do whatever you want here


    // Return true so that the change happens
    return true
}

UITextFieldDelegate에서 이 위임 메서드를 사용할 수 있습니다.캐릭터가 바뀔 때마다 불이 붙습니다.

(Objective C) textField:shouldChangeCharactersInRange:replacementString:
(Swift) textField(_:shouldChangeCharactersInRange:replacementString:)

그러나 이는 변경하기 전에만 실행됩니다(사실 변경은 여기서 true로 반환하는 경우에만 실행됩니다).

RxSwift를 사용할 수 있습니까?

필요하다.

pod 'RxSwift',    '~> 3.0'
pod 'RxCocoa',    '~> 3.0'

수입품을 분명히 추가합니다.

import RxSwift
import RxCocoa

그래서 당신은textfield : UITextField

let observable: Observable<String?> = textField.rx.text.asObservable()
observable.subscribe(
            onNext: {(string: String?) in
                print(string!)
        })

다른 3가지 방법이 있습니다.

  1. 오류 발생 시
  2. 완료 시
  3. 처분된
  4. 다음에

스위프트 4

textField.addTarget(self, action: #selector(textIsChanging), for: UIControlEvents.editingChanged)

@objc func textIsChanging(_ textField:UITextField) {

 print ("TextField is changing")

}

사용자가 완전히 입력한 후 변경하려면 키보드를 해제하거나 Enter 키를 누르면 호출됩니다.

textField.addTarget(self, action: #selector(textDidChange), for: UIControlEvents.editingDidEnd)

 @objc func textDidChange(_ textField:UITextField) {

       print ("TextField did changed") 
 }

다음 단계를 수행해야 합니다.

  1. 텍스트 필드에 Outlet 참조 만들기
  2. 컨트롤러 클래스에 UITextFieldDelegate 할당
  3. TextField.delegate를 구성합니다.
  4. 필요한 모든 기능 구현

샘플 코드:

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet var yourTextFiled : UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()

        yourTextFiled.delegate = self
    }


    func textFieldDidEndEditing(_ textField: UITextField) {
        // your code
    }

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        // your code
    }

    .
    .
    .
}

addTarget을 당신의 UItextField에 바인딩할 수 없는 경우, 위에서 제안한 바와 같이 바인딩하고 shouldChangeCharacters의 끝에 실행을 위한 코드를 삽입하는 것이 좋습니다.방식대로.

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

@objc func textFieldDidChange(_ textField: UITextField) {
    if phoneNumberTextField.text!.count == 17 && nameTextField.text!.count > 0 {
        continueButtonOutlet.backgroundColor = UIColor(.green)
    } else {
        continueButtonOutlet.backgroundColor = .systemGray
    }
}

그리고 통화 시 문자를 변경해야 합니다.func에서.

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

    guard let text = textField.text else {
        return true
    }
    let lastText = (text as NSString).replacingCharacters(in: range, with: string) as String

    if phoneNumberTextField == textField {
        textField.text = lastText.format("+7(NNN)-NNN-NN-NN", oldString: text)
        textFieldDidChange(phoneNumberTextField)
        return false
    }
    return true
}

이제 iOS13+에서 사용할 수 있는 UITextField 대리자 메서드가 있습니다.

optional func textFieldDidChangeSelection(_ textField: UITextField)
txf_Subject.addTarget(self, action:#selector(didChangeFirstText), for: .editingChanged)

@objc func didChangeText(textField:UITextField) {
    let str = textField.text
    if(str?.contains(" "))!{
        let newstr = str?.replacingOccurrences(of: " ", with: "")
        textField.text = newstr
    }
}

@objc func didChangeFirstText(textField:UITextField) {
    if(textField.text == " "){
        textField.text = ""
    }
}

스위프트 4.2

뷰에 기록합니다. DidLoad

// to detect if TextField changed
TextField.addTarget(self, action: #selector(textFieldDidChange(_:)),
                                   for: UIControl.Event.editingChanged)

외부 뷰 작성DidLoad

@objc func textFieldDidChange(_ textField: UITextField) {
    // do something
}

UI 컨트롤을 통해 이벤트를 변경할 수 있습니다.Event.editingDidBegin 또는 탐지하려는 모든 항목.

다음과 같이 추가할 수 있습니다.textField text change listenerSwift 3 사용:

를 래스선으로 합니다.UITextFieldDelegate

override func viewDidLoad() {
    super.viewDidLoad()

    textField.delegate = self

    textField.addTarget(self, action: #selector(UITextFieldDelegate.textFieldShouldEndEditing(_:)), for: UIControlEvents.editingChanged)
}

그런 다음 전통적으로 textFieldShouldEndEdit 함수를 추가합니다.

func textFieldShouldEndEditing(_ textField: UITextField) -> Bool { // do stuff
        return true 
}

혹시 스위프트에 관심이 있으시다면요.UI 솔루션, 이 솔루션이 저에게 도움이 됩니다.

 TextField("write your answer here...",
            text: Binding(
                     get: {
                        return self.query
                       },
                     set: { (newValue) in
                        self.fetch(query: newValue) // any action you need
                                return self.query = newValue
                      }
            )
  )

저는 제 생각이 아니라고 말해야겠습니다. 저는 이 블로그에서 그것을 읽었습니다.SwiftUI 바인딩: 매우 간단한 트릭

"문자 변경" 델타게이트 또는 "시작 및 종료" 텍스트 필드 위임을 통해 편집을 관리할 수 있습니다.위임자를 설정하는 것을 잊지 마십시오.

아래의 "did begin and end editing"을 사용하여 이 작업을 수행할 수 있습니다.

//MARK:- TextViewDelegate
extension ViewController: UITextFieldDelegate {
    func textFieldDidEndEditing(_ textField: UITextField) {
        let count = self.tfEmail.text?.count ?? 0
        if textField == self.tfEmail {
            if count == 0{
              //Empty textfield
            }else{
              //Non-Empty textfield
            }
        }
    }
    func textFieldDidBeginEditing(_ textField: UITextField) {
        if textField == self.tfEmail{
            //when user taps on textfield
        }
    }
}

swift 4

뷰에서 DidLoad():

    //ADD BUTTON TO DISMISS KEYBOARD

    // Init a keyboard toolbar 
    let toolbar = UIView(frame: CGRect(x: 0, y: view.frame.size.height+44, width: view.frame.size.width, height: 44))
    toolbar.backgroundColor = UIColor.clear

    // Add done button
    let doneButt = UIButton(frame: CGRect(x: toolbar.frame.size.width - 60, y: 0, width: 44, height: 44))
    doneButt.setTitle("Done", for: .normal)
    doneButt.setTitleColor(MAIN_COLOR, for: .normal)
    doneButt.titleLabel?.font = UIFont(name: "Titillium-Semibold", size: 13)
    doneButt.addTarget(self, action: #selector(dismissKeyboard), for: .touchUpInside)
    toolbar.addSubview(doneButt)

    USDTextField.inputAccessoryView = toolbar

다음 기능을 추가합니다.

    @objc func dismissKeyboard() {
      //Causes the view (or one of its embedded text fields) to resign the first responder status.
      view.endEditing(true)
    }

언급URL : https://stackoverflow.com/questions/28394933/how-do-i-check-when-a-uitextfield-changes

반응형