Như đã nêu ở đây: Sự kiện thay đổi văn bản UITextField , dường như kể từ iOS 6 (đã kiểm tra iOS 6.0 và 6.1), không thể phát hiện đầy đủ các thay đổi trong UITextField
các đối tượng chỉ bằng cách quan sát UITextFieldTextDidChangeNotification
.
Có vẻ như chỉ những thay đổi được thực hiện trực tiếp bởi bàn phím iOS tích hợp mới được theo dõi ngay bây giờ. Điều này có nghĩa là nếu bạn thay đổi UITextField
đối tượng của mình chỉ bằng cách gọi một cái gì đó như thế này : myUITextField.text = @"any_text"
, bạn sẽ không được thông báo về bất kỳ thay đổi nào cả.
Tôi không biết đây là một lỗi hay nó được dự định. Có vẻ như một lỗi vì tôi không tìm thấy bất kỳ lời giải thích hợp lý trong tài liệu. Điều này cũng được nêu ở đây: sự kiện thay đổi văn bản UITextField .
"Giải pháp" của tôi cho vấn đề này là thực sự tự mình gửi một thông báo cho mọi thay đổi tôi thực hiện UITextField
(nếu thay đổi đó được thực hiện mà không cần sử dụng bàn phím iOS tích hợp). Một cái gì đó như thế này:
myUITextField.text = @"I'm_updating_my_UITextField_directly_in_code";
NSNotification *myTextFieldUpdateNotification =
[NSNotification notificationWithName:UITextFieldTextDidChangeNotification
object:myUITextField];
[NSNotificationCenter.defaultCenter
postNotification:myTextFieldUpdateNotification];
Bằng cách này, bạn tự tin 100% rằng bạn sẽ nhận được thông báo tương tự khi bạn thay đổi thuộc .text
tính của UITextField
đối tượng, khi bạn cập nhật "thủ công" trong mã của mình hoặc thông qua bàn phím iOS tích hợp.
Điều quan trọng là phải xem xét rằng, vì đây không phải là hành vi được ghi lại, cách tiếp cận này có thể dẫn đến 2 thông báo nhận được cho cùng một thay đổi trong UITextField
đối tượng của bạn . Tùy thuộc vào nhu cầu của bạn (những gì bạn thực sự làm khi UITextField.text
thay đổi) đây có thể là một sự bất tiện cho bạn.
Một cách tiếp cận hơi khác sẽ là đăng một thông báo tùy chỉnh (đây là, với một tên tùy chỉnh khác UITextFieldTextDidChangeNotification
) nếu bạn thực sự cần biết liệu thông báo đó là của bạn hay "do iOS tạo ra".
BIÊN TẬP:
Tôi vừa tìm thấy một cách tiếp cận khác mà tôi nghĩ có thể tốt hơn:
Điều này liên quan đến tính năng Quan sát giá trị khóa (KVO) của Objective-C ( http://developer.apple.com/l Library / ios / # document.com / cocoa / conception / 10000177-BCICJDHA ).
Về cơ bản, bạn đăng ký cho mình như một người quan sát một tài sản và nếu tài sản này thay đổi, bạn sẽ được thông báo về nó. "Nguyên tắc" khá giống với cách NSNotificationCenter
hoạt động, là ưu điểm chính mà phương pháp này hoạt động tự động kể từ iOS 6 (không có bất kỳ tinh chỉnh đặc biệt nào như phải đăng thông báo thủ công).
Đối với UITextField
-scenario của chúng tôi, nó hoạt động tốt nếu bạn thêm mã này vào, ví dụ, mã của bạn UIViewController
có chứa trường văn bản:
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];
}
Tín dụng cho câu trả lời này liên quan đến quản lý "bối cảnh": https://stackoverflow.com/a/12097161/2078512
Lưu ý: Có vẻ như trong khi bạn đang trong quá trình chỉnh sửa UITextField
bằng bàn phím iOS tích hợp, thuộc tính "văn bản" của trường văn bản không được cập nhật với mỗi chữ cái mới được gõ / xóa. Thay vào đó, đối tượng trường văn bản được cập nhật "toàn bộ" sau khi bạn từ bỏ trạng thái phản hồi đầu tiên của trường văn bản.