2011-12-20 37 views
5

Sử dụng trung tâm thông báo, như được mô tả trong How can I get a textDidChange (like for a UISearchBar) method for a UITextField?, cho phép bạn nhận thông báo khi văn bản trong thay đổi UITextField trên iOS. Tôi không thấy thông báo tương tự cho các thay đổi lựa chọn. Cách tốt nhất để phát hiện và phản hồi những thay đổi trong lựa chọn cho một UITextField là gì?Cách tốt nhất để nhận thông báo lựa chọn UITextField đã thay đổi thông báo là gì?

Trả lời

-3

Kết nối phương thức sử dụng mục tiêu/hành động cho sự kiện kiểm soát UIControlEventEditingChanged trên ví dụ của bạn UITextField. Điều này có thể được thực hiện trong trình tạo giao diện hoặc trong mã bằng cách thêm cặp đích/hành động vào trường văn bản và sau đó triển khai phương thức được chỉ định.

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

UITextField cũng tuyên bố một giao thức UITextFieldDelegate với các phương pháp mà bạn có thể thực hiện trong lớp học của bạn để được thông báo về những thay đổi đến một instance của UITextField. Tôi khuyên bạn nên trở nên thoải mái với phái đoàn vì nó là một mô hình phổ biến trong khuôn khổ Cocoa.

UITextFieldDelegate Class Reference

+2

[ 'UIControlEventEditingChanged'] (http://developer.apple.com/library/ios/documentation/uikit/reference/UIControl_Class/Reference/Reference.html#//apple_ref/doc/c_ref/UIControlEventEditingChanged) chỉ đề cập đến chỉnh sửa văn bản. Tức là, hành động chỉ kích hoạt khi văn bản thay đổi trong trường văn bản 'isEditing'. Điều này không bao gồm các thay đổi lựa chọn. – ma11hew28

0

này link có một giải pháp mà không phiền với apis tin:

Nói tóm lại: Subclass UITextField, thực hiện

-(BOOL)canPerformAction:(SEL)action withSender:(id)sender 

và kiểm tra nếu phạm vi lựa chọn đã thay đổi. Nhưng điều này không thông báo về vòi.

Vì vậy, những gì tôi đã làm là sau khi subclassing, quan sát selectedTextRange tài sản:

-(void)awakeFromNib { 
    [self addObserver:self forKeyPath:@"selectedTextRange" options:0 context:nil]; 
} 

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 
    [self notifyDelegateIfNecessary]; 
} 

trình rất tốt trong iOS8.

+1

lý do tại sao bạn không ghi đè lên [UITextField setSelectedTextRange: (UITextRange *) selectedTextRange] nếu bạn đã làm lớp con UITextField? Sau đó, tất cả các thay đổi sẽ xuất hiện ở nơi này. – Leo

+0

@Leo 1. Tôi không muốn thay đổi hành vi, chỉ nhận được thông báo 2. Tôi vừa kiểm tra PlayGround và tôi nghĩ bạn không thể ghi đè chức năng đó. – Krisdigital

+0

Nó hoạt động cho tôi (IOS 8 + 9). Bằng cách này tôi bao quanh các nhu cầu để loại bỏ các quan sát viên ở nơi thích hợp. – Leo

0

Có cách đơn giản để phát hiện lựa chọn trong TextField

add đối tượng quan sát viên bất động sản trong viewDidAppear

[self.keyboardInputFieldPassword addObserver:self forKeyPath:@"selectedTextRange" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil]; 

Sau đó Thêm quan sát chức năng cho bất động sản

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 
    if([keyPath isEqualToString:@"selectedTextRange"] && self.keyboardInputFieldPassword == object) 
     [self textFieldDidChangeSelection:self.keyboardInputFieldPassword]; 
} 

này sẽ nắm bắt được nhiều lựa chọn trong UITextField

Để theo dõi c onvention, bạn nên removeObserver trong viewDidDisappear

[self.keyboardInputFieldPassword removeObserver:self forKeyPath:@"selectedTextRange" context:nil]; 
Các vấn đề liên quan