UITextField 텍스트 변경 이벤트
textField의 해야 ? 방식 " " "shouldChangeCharactersInRange효과가 있었지만, 제 욕구를 정확히 충족시키지는 못했습니다.YES를 반환할 때까지 textField 텍스트는 다른 옵서버 메서드에서 사용할 수 없습니다.
내 :: :코코 e e e e e e ecalculateAndUpdateTextFields업데이트된 텍스트를 수신하지 못했습니다.사용자가 입력했습니다.
으로든 런런걸 something something 같은 것을 수 요?textChanged자바
- (BOOL)textField:(UITextField *)textField
shouldChangeCharactersInRange:(NSRange)range
replacementString:(NSString *)string
{
if (textField.tag == kTextFieldTagSubtotal
|| textField.tag == kTextFieldTagSubtotalDecimal
|| textField.tag == kTextFieldTagShipping
|| textField.tag == kTextFieldTagShippingDecimal)
{
[self calculateAndUpdateTextFields];
}
return YES;
}
올바른 방법으로 uitextfield 텍스트 변경 콜백:
다음과 같이 UITextField 컨트롤로 전송되는 문자를 포착합니다.
// Add a "textFieldDidChange" notification method to the text field control.
목표-C:
[textField addTarget:self
action:@selector(textFieldDidChange:)
forControlEvents:UIControlEventEditingChanged];
Swift의 경우:
textField.addTarget(self, action: #selector(textFieldDidChange), for: .editingChanged)
후 리 the the
textFieldDidChangemethod는 textField의 내용을 확인하고 필요에 따라 테이블뷰를 새로고침할 수 있습니다.
이를 사용하여 calculateAndUpdateTextFields를 사용하여selector.
XenElement의 대답은 딱 들어맞습니다.
위의 내용은 인터페이스 빌더에서도 UITextField를 오른쪽 클릭하여 "Editing Changed" 송신 이벤트를 서브클래스 유닛으로 드래그하여 실행할 수 있습니다.

이벤트 리스너를 설정합니다.
[self.textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];
실제로 듣는 방법:
- (void)textFieldDidChange:(UITextField *)textField {
NSLog(@"text changed: %@", textField.text);
}
신속:
yourTextfield.addTarget(self, action: #selector(yourHandler(textField:)), for: .editingChanged)
다음으로 콜백 기능을 구현합니다.
@objc final private func yourHandler(textField: UITextField) {
print("Text changed")
}
여기에 기재된 바와 같이 UITextField 텍스트 변경 이벤트에서는 iOS 6(iOS 6.0 및 6.1 체크)에서는 변경을 완전히 검출할 수 없는 것 같습니다.UITextField하는 UITextFieldTextDidChangeNotification
내장 iOS 키보드에 의해 직접 변경된 내용만 추적되는 것 같습니다.즉, 이 명령어를 바꾸면UITextField합니다.myUITextField.text = @"any_text"을 사용법
이게 버그인지 의도된 건지 모르겠어요.설명서에서 타당한 설명을 찾을 수 없었기 때문에 버그인 것 같습니다.이것도 여기에 기재되어 있습니다.UITextField 텍스트 변경 이벤트입니다.
저의 은 제가 '을 할 마다 '을입니다.UITextField(iOS의 경우).다음과 같이 합니다.
myUITextField.text = @"I'm_updating_my_UITextField_directly_in_code";
NSNotification *myTextFieldUpdateNotification =
[NSNotification notificationWithName:UITextFieldTextDidChangeNotification
object:myUITextField];
[NSNotificationCenter.defaultCenter
postNotification:myTextFieldUpdateNotification];
'을 '알림'으로 때, '을 받을 수 % 확신할 수 ..text UITextField오브젝트는 코드로 수동으로 갱신하거나 내장된 iOS 키보드를 통해 갱신할 때 사용합니다.
동작이 에, 이 방법을 하면, 「」의 것에 , 되는 경우가 UITextField (실제로 )UITextField.text변경사항) 이것은 당신에게 불편할 수 있습니다.
방법으로 , 이름 ).UITextFieldTextDidChangeNotification알림이 사용자의 것인지, "iOS 제조"인지 여부를 실제로 알고 싶은 경우).
편집:
저는 방금 다른 접근방식을 발견했는데, 이것이 더 나을 것 같습니다.
여기에는 Objective-C(http://developer.apple.com/library/ios/#documentation/cocoa/conception/KeyValueObserving/KeyValueObserving.html#//apple_ref/doc/uid/10000177-BCICJDHA)의 Key-VO 기능이 포함됩니다.
기본적으로, 당신은 부동산의 옵서버로 등록하고, 이 부동산이 변경되면 그 사실을 알립니다.은 '원칙'과.NSNotificationCenter(수동으로 알림을 게시하는 등의 특별한 조정 없이) 이 접근법이 iOS 6에서도 자동으로 작동한다는 것이 주된 장점입니다.
★★★★★★★★의 경우UITextField 이 코드와 같은 와 함께 합니다.UIViewController하다
static void *myContext = &myContext;
- (void)viewDidLoad {
[super viewDidLoad];
//Observing changes to myUITextField.text:
[myUITextField addObserver:self forKeyPath:@"text"
options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld
context:myContext];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
change:(NSDictionary *)change context:(void *)context {
if(context == myContext) {
//Here you get notified every time myUITextField's "text" property is updated
NSLog(@"New value: %@ - Old value: %@",
[change objectForKey:NSKeyValueChangeNewKey],
[change objectForKey:NSKeyValueChangeOldKey]);
}
else
[super observeValueForKeyPath:keyPath ofObject:object
change:change context:context];
}
"관리"에 관한 답변은 https://stackoverflow.com/a/12097161/2078512에서 확인할 수 있습니다.
주의: 편집 중인 것 같습니다.UITextField내장된 iOS 키보드를 사용하면 텍스트 필드의 "텍스트" 속성이 입력 또는 삭제될 때마다 업데이트되지 않습니다.대신 텍스트 필드의 첫 번째 응답자 상태를 재서명하면 텍스트 필드 오브젝트가 "전체"로 업데이트됩니다.
에서 쉽게 할 수 .Storyboard, , Ctrl을 @IBAction이벤트를 다음과 같이 변경합니다.
여기도 마찬가지로 빠른 버전입니다.
textField.addTarget(self, action: "textFieldDidChange:", forControlEvents: UIControlEvents.EditingChanged)
func textFieldDidChange(textField: UITextField) {
}
감사해요.
should Change Chracters In Range 동작 변경 문제를 해결했습니다.NO를 반환할 경우 iOS에서 내부적으로 변경 사항이 적용되지 않습니다. 대신 수동으로 변경 후 작업을 수행할 수 있습니다.
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
//Replace the string manually in the textbox
textField.text = [textField.text stringByReplacingCharactersInRange:range withString:string];
//perform any logic here now that you are sure the textbox text has changed
[self didChangeTextInTextField:textField];
return NO; //this make iOS not to perform any action
}
를 통과할 수 .UIAction신신: :
let editingChanged = UIAction { _ in
// Do something when text changes...
}
myTextField.addAction(editingChanged, for: .editingChanged)
테스트된 Swift 버전:
//Somewhere in your UIViewController, like viewDidLoad(){ ... }
self.textField.addTarget(
self,
action: #selector(SearchViewController.textFieldDidChange(_:)),
forControlEvents: UIControlEvents.EditingChanged
)
파라미터 설명:
self.textField //-> A UITextField defined somewhere in your UIViewController
self //-> UIViewController
.textFieldDidChange(_:) //-> Can be named anyway you like, as long as it is defined in your UIViewController
다음 에서 만든 을 '보다 낫다'에.UIViewController:
//Gets called everytime the text changes in the textfield.
func textFieldDidChange(textField: UITextField){
print("Text changed: " + textField.text!)
}
스위프트 4
func addNotificationObservers() {
NotificationCenter.default.addObserver(self, selector: #selector(textFieldDidChangeAction(_:)), name: .UITextFieldTextDidChange, object: nil)
}
@objc func textFieldDidChangeAction(_ notification: NSNotification) {
let textField = notification.object as! UITextField
print(textField.text!)
}
Swift 3.0의 경우:
let textField = UITextField()
textField.addTarget(
nil,
action: #selector(MyClass.textChanged(_:)),
for: UIControlEvents.editingChanged
)
다음과 같은 클래스를 사용합니다.
class MyClass {
func textChanged(sender: Any!) {
}
}
Swift 3 버전
yourTextField.addTarget(self, action: #selector(YourControllerName.textChanges(_:)), for: UIControlEvents.editingChanged)
그리고 여기서 잔돈 가져와
func textChanges(_ textField: UITextField) {
let text = textField.text! // your desired text here
// Now do whatever you want.
}
도움이 됐으면 좋겠다.
- KVO 솔루션이 작동하지 않음
KVO는 iOS에서 컨트롤에 사용할 수 없습니다.http://stackoverflow.com/a/6352525/1402846 https://developer.apple.com/library/archive/documentation/General/Conceptual/DevPedia-CocoaCore/KVO.html
- 관찰 수업에서는 다음과 같이 합니다.
보고 싶은 텍스트 보기를 알고 있는 경우:
var watchedTextView: UITextView!
다음을 수행합니다.
NotificationCenter.default.addObserver(
self,
selector: #selector(changed),
name: UITextView.textDidChangeNotification,
object: watchedTextView)
단, 이 점에 주의해 주십시오.
한 번만 전화를 걸 수 있기 때문에 예를 들어, 전화를 걸지금은 호출하지 마십시오.
layoutSubviews말을 꺼내는 과정에서 언제 전화를 걸어야 할지 잘 모르겠어요.그것은 당신의 상황에 따라 다릅니다.유감스럽게도 표준 록인 솔루션은 없습니다.
예를 들어, 당신은 보통 그것을 확실히 부를 수 없다.
init그watchedTextView하지 않을 도 있다
.
- 다음 문제는 ...라는 것이다.
텍스트가 프로그래밍 방식으로 변경될 때 알림이 호출되지 않습니다.
이것은 iOS 엔지니어링에서 크고 오래되고 어리석은 성가신 일입니다.
컨트롤은 단순히 .text 속성이 프로그래밍 방식으로 변경되었을 때 알림을 호출하지 않습니다.
이것은 매우 짜증나는 일이다.왜냐하면, 지금까지 만들어진 모든 앱은, 유저가 투고 후에 필드를 클리어 하는 등, 프로그래밍 방식으로 텍스트를 설정하기 때문이다.
텍스트 보기(또는 유사한 컨트롤)를 다음과 같이 하위 분류해야 합니다.
class NonIdioticTextView: UIITextView {
override var text: String! {
// boilerplate code needed to make watchers work properly:
get {
return super.text
}
set {
super.text = newValue
NotificationCenter.default.post(
name: UITextView.textDidChangeNotification,
object: self)
}
}
}
(팁 - 슈퍼콜은 포스트콜 전에 와야 한다는 것을 잊지 마십시오.
위에 표시된 대로 하위 분류하여 컨트롤을 수정하지 않는 한 사용할 수 있는 솔루션은 없습니다.그것이 유일한 해결책이다.
알림은
UITextView.textDidChangeNotification
을 낳다
func textViewDidChangeSelection(_ textView: UITextView)
불리고 있다.
(없음) textViewDidChange
Swift 3.1:
선택기:ClassName(클래스명)메서드명
cell.lblItem.addTarget(self, action: #selector(NewListScreen.fieldChanged(textfieldChange:)), for: .editingChanged)
func fieldChanged(textfieldChange: UITextField){
}
이 문제를 해결하려면 알림을 사용해야 합니다. 왜냐하면 다른 방법은 실제 입력이 아닌 입력 상자를 듣기 때문입니다. 특히 중국어 입력 방식을 사용할 때는 더욱 그렇습니다.in viewDidload
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFiledEditChanged:)
name:@"UITextFieldTextDidChangeNotification"
object:youTarget];
그리고나서
- (void)textFiledEditChanged:(NSNotification *)obj {
UITextField *textField = (UITextField *)obj.object;
NSString *toBestring = textField.text;
NSArray *currentar = [UITextInputMode activeInputModes];
UITextInputMode *currentMode = [currentar firstObject];
if ([currentMode.primaryLanguage isEqualToString:@"zh-Hans"]) {
UITextRange *selectedRange = [textField markedTextRange];
UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];
if (!position) {
if (toBestring.length > kMaxLength)
textField.text = toBestring;
}
}
마침내 도망치면 끝장이야
Swift 3 버전:
class SomeClass: UIViewController, UITextFieldDelegate {
@IBOutlet weak var aTextField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
aTextField.delegate = self
aTextField.addTarget(self, action: #selector(SignUpVC.textFieldDidChange), for: UIControlEvents.editingChanged)
}
func textFieldDidChange(_ textField: UITextField) {
//TEXT FIELD CHANGED..SECRET STUFF
}
}
대표자를 설정하는 것을 잊지 마세요.
닫힘 포함:
class TextFieldWithClosure: UITextField {
var targetAction: (() -> Void)? {
didSet {
self.addTarget(self, action: #selector(self.targetSelector), for: .editingChanged)
}
}
func targetSelector() {
self.targetAction?()
}
}
및 사용
textField.targetAction? = {
// will fire on text changed
}
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(didChangeTextViewText:)
name:UITextFieldTextDidChangeNotification object:nil];
- (void) didChangeTextViewText {
//do something
}
하나는 여러 개의 UITextField가 있을 수 있다는 것입니다.태그를 붙이고 나서 태그를 켤 수 있습니다.모든 클래스에 옵서버를 설정하는 방법은 다음과 같습니다.
private func setupTextFieldNotification() {
NotificationCenter.default.addObserver(forName: UITextField.textDidChangeNotification, object: nil, queue: OperationQueue.main) { (notification) in
if let textField = notification.object as? UITextField, textField.tag == 100, let text = textField.text {
print(#line, text)
}
}
}
deinit {
NotificationCenter.default.removeObserver(self)
}
SwiftUI
Swift를 Swift UI를 사용합니다.TextField UIKit를 하는 것만으로 할 수 있습니다.UITextField(이 방법은 다음과 같습니다), 다음과 같은 텍스트 변화를 관찰할 수 있습니다.
SwiftUI 2.0
또는 에는 SwiftiOS 14, macOS 11은 Swift가 되어 있습니다.2.에는 UI 2.0이라는 ..onChange의 변화 을 실시합니다.state:
struct ContentView: View {
@State var text: String = ""
var body: some View {
TextField("Enter text here", text: $text)
.onChange(of: text) {
print($0) // You can do anything due to the change here.
// self.autocomplete($0) // like this
}
}
}
SwiftUI 1.0
등 ★★ ★★★★Swift★1.0 1.0 사용 onReceive콤바인 프레임워크의 도움을 받아 다음을 수행합니다.
import Combine
.onReceive(Just(text)) {
print($0)
}
를 사용할 수 있습니다.text.publisherJust(text)그러나 전체 값이 아니라 변경 내용을 반환합니다.
Swift 4 버전
키-값 관찰 사용 다른 개체의 속성 변경에 대해 개체에 알립니다.
var textFieldObserver: NSKeyValueObservation?
textFieldObserver = yourTextField.observe(\.text, options: [.new, .old]) { [weak self] (object, changeValue) in
guard let strongSelf = self else { return }
print(changeValue)
}
언급URL : https://stackoverflow.com/questions/7010547/uitextfield-text-change-event
'programing' 카테고리의 다른 글
| bash 명령어에 여러 env 변수를 설정하는 방법 (0) | 2023.04.13 |
|---|---|
| '치명적 오류:Optional value'의 래핑을 해제하는 동안 예기치 않게 0이 발견되었습니까? (0) | 2023.04.13 |
| winrm을 사용하여 신뢰할 수 있는 호스트 목록에 둘 이상의 시스템을 추가하는 방법 (0) | 2023.04.13 |
| Excel 파일 생성 시 Column Width를 올바르게 설정하는 방법(Column 속성) (0) | 2023.04.13 |
| iOS 7+에서의 Base64 디코딩 (0) | 2023.04.13 |
