필드가 업데이트 될 때 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() {
....
}
'programing tip' 카테고리의 다른 글
SearchView를 자동으로 확장하고 포커스를 제공합니다. (0) | 2020.11.06 |
---|---|
Pandas의 열 이름을 기반으로 여러 열 삭제 (0) | 2020.11.06 |
배포 인증서 / 개인 키가 설치되지 않았습니다. (0) | 2020.11.06 |
Android에서 EditText를 입력 한 후 키보드를 숨기는 방법은 무엇입니까? (0) | 2020.11.06 |
주소를 위도 / 경도로 변환하는 방법은 무엇입니까? (0) | 2020.11.05 |