programing tip

필드가 업데이트 될 때 UITextField "값 변경됨"이 실행되지 않음

itbloger 2020. 11. 6. 07:54
반응형

필드가 업데이트 될 때 UITextField "값 변경됨"이 실행되지 않음


나는이 IBAction내가 연결 한 것을 UITextField인터페이스 빌더의 요소입니다. ( "값 변경"이벤트 발생)

UISlider값이 조정되면 TextField 요소를 자동으로 업데이트하는 것도 있습니다 .

내 앱을 실행할 때 슬라이더를 조정할 때 TextField가 업데이트되지만이 경우 "값 변경됨"이벤트가 발생하지 않습니다. 값 변경 이벤트는 TextField를 직접 편집 할 때도 발생하지 않습니다. (Did Editing End 트리거를 사용하면 트리거가 실행되지만).

내 질문은 TextField의 프로그래밍 방식 업데이트와 사용자가 값을 조정할 때 발생하는 값 변경 트리거를 어떻게 얻을 수 있습니까?


TheRonin이 제안한대로 UITextFieldDelegate다음 방법을 사용 하고 구현합니다.

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

사용하지 마십시오 UIControlEventValueChanged위해 UITextField. 당신이 원하는 것은 UIControlEventEditingChanged.


을 얻으려면 EditingChanged textfield event선택기를 다음과 같이 추가하는 것이 좋습니다.

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

텍스트 필드 값이 변경되면이 textChanged:선택기 에서 얻을 수있는 변경된 값 입니다.

-(void)textChanged:(UITextField *)textField
{
    NSLog(@"textfield data %@ ",textField.text);
}

텍스트 필드에 대리자를 할당하는 경우 아래 대리자 메서드에서 NO를 반환하면 이벤트 (Editing changed)가 트리거되지 않습니다.이 메서드에서 NO를 반환 할 때 이벤트 리스너를 호출하는 것이 좋습니다.

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

오래된 질문이지만 내가 찾은 첫 번째 검색 결과이며 만족스러운 답변이 없습니다. 이 솔루션이 가장 잘 작동한다는 것을 알았습니다. Swift UITextField 하위 클래스는 프로그래밍 방식으로 텍스트 변경을 처리합니다 .

UITextField의 text 속성을 재정 의하여 didSet ()을 추가하고 거기에서 값 변경 함수를 호출합니다.

  override open var text: String? {
        didSet {
            myValueDidChange()
        }
    }

스위프트 4 :

class YourViewController: UIViewController {
    // MARK: Outlets
    @IBOutlet weak var titleTextField: UITextField!

    // MARK: View lifecycle
    override func viewDidLoad() {
        super.viewDidLoad()
        titleTextField.delegate = self
    }
}

// MARK: UITextFieldDelegate methods
extension YourViewController: UITextFieldDelegate {
    func textField(_ textField: UITextField,
                   shouldChangeCharactersIn range: NSRange,
                   replacementString string: String) -> Bool {
        print("changed")
        return true
    }
}

값은 프로그래밍 방식으로 할당되지만이 경우 실제로 textField가 변경되지 않았으므로 textFieldDidChange가 호출되지 않습니다. 이 외부 이벤트는 통과해야합니다.

예를 들어, textfield.sendActions (for : .editingChanged) 이렇게하면 편집 변경 이벤트가 발생하고 textFieldDidChange는 프로그래밍 방식으로 값이 변경된 후에도 호출됩니다.

이 이벤트를 적용 할 위치 :

텍스트 필드에 값을 할당 한 후 (예 : textfield.text = "some value")


대한 스위프트 3 :

textField.addTarget(self, action: #selector(textChanged), for: .valueChanged)

func textChanged() { 
 .... 
}

참고 URL : https://stackoverflow.com/questions/8224221/uitextfield-value-changed-not-firing-when-field-is-updated

반응형