2009-07-15 36 views
17

Tôi có một UITextField trong một lớp MyCustomUIView và khi UITextField mất tiêu điểm, tôi muốn ẩn trường và hiển thị nội dung khác tại chỗ.UITextField mất sự kiện lấy nét

Đại biểu cho số UITextField được đặt thành MyCustomUIView qua IB và tôi cũng có các sự kiện 'Đã kết thúc khi thoát' và 'Chỉnh sửa đã kết thúc' trỏ đến phương thức IBAction trong phạm vi MyCustomUIView.

@interface MyCustomUIView : UIView { 

IBOutlet UITextField *myTextField; 

} 

-(IBAction)textFieldLostFocus:(UITextField *)textField; 

@end 

Tuy nhiên, không có sự kiện nào trong số này xảy ra khi UITextField mất tập trung. Làm thế nào để bạn bẫy/tìm kiếm sự kiện này?

Đại biểu cho số UITextField được đặt làm MyCustomUIView vì vậy tôi nhận được thông báo textFieldShouldReturn để loại bỏ bàn phím khi hoàn tất.

Nhưng những gì tôi cũng quan tâm là tìm khi người dùng nhấn một số khu vực khác trên màn hình (nói điều khiển khác hoặc vùng trống) và trường văn bản đã bị mất tiêu điểm.

Trả lời

11

Tôi tin rằng bạn cần phải chỉ định xem bạn như là một đại biểu UITextField như vậy:

@interface MyCustomUIView : UIView <UITextFieldDelegate> { 

Là một tiền thưởng thêm, đây là cách bạn có được bàn phím để biến mất khi họ bấm "thực hiện" hoặc trả lại nút, tùy thuộc vào cách bạn đã thiết lập tài sản đó:

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField { 
    //This line dismisses the keyboard.  
    [theTextField resignFirstResponder]; 
    //Your view manipulation here if you moved the view up due to the keyboard etc.  
    return YES; 
} 
2

bạn có thể phải phân lớp các UITextField và ghi đè resignFirstResponder. resignFirstResponder sẽ được gọi khi trường văn bản bị mất tiêu điểm.

4

Vấn đề với giải pháp resignFirstResponder chỉ là, nó chỉ có thể được kích hoạt bởi một bàn phím rõ ràng hoặc UITextField sự kiện. Tôi cũng đang tìm kiếm một "sự kiện tập trung bị mất" để ẩn bàn phím, nếu một nơi nào đó bên ngoài trường văn bản được khai thác. Giải pháp "thực tế" gần gũi và thực tế nhất là vô hiệu hóa tương tác cho các chế độ xem khác cho đến khi người dùng kết thúc chỉnh sửa (nhấn hoàn thành/trả về trên bàn phím) nhưng vẫn có thể chuyển giữa các trường văn bản để chỉnh sửa mà không cần phải trượt ra ngoài và trong bàn phím mọi lúc.

Đoạn sau đây có thể hữu ích cho một ai đó, ai muốn làm điều tương tự:

// disable all views but textfields 
// assign this action to all textfields in IB for the event "Editing Did Begin" 
-(IBAction) lockKeyboard : (id) sender { 

    for(UIView *v in [(UIView*)sender superview].subviews) 
     if (![v isKindOfClass:[UITextField class]]) v.userInteractionEnabled = NO; 
} 

// reenable interactions 
// assign this action to all textfields in IB for the event "Did End On Exit" 
-(IBAction) disMissKeyboard : (id) sender { 

    [(UIResponder*)sender resignFirstResponder]; // hide keyboard 

    for(UIView *v in [(UIView*)sender superview].subviews) 
     v.userInteractionEnabled = YES; 
} 
26

Hãy thử sử dụng đại biểu cho phương pháp sau đây:

- (BOOL) textFieldShouldEndEditing:(UITextField *)textField { 
    NSLog(@"Lost Focus for content: %@", textField.text); 
    return YES; 
} 

Đó làm việc cho tôi.

1

tôi nghĩ rằng bạn đã thực hiện UIKeyboardDidHideNotification và trong trường hợp này, bạn

sử dụng mã như

[theTextField resignFirstResponder]; 

loại bỏ mã này.

cùng mã viết bằng phương thức textFieldShouldReturn. điều này cũng mất tập trung.

0

Đối với những người đang gặp khó khăn với điều này trong Swift. Chúng tôi thêm trình nhận dạng cử chỉ vào chế độ xem của ViewController để khi chế độ xem được khai thác, chúng tôi sẽ loại bỏ trường văn bản. Điều quan trọng là không hủy các nhấp chuột tiếp theo trên chế độ xem.

Swift 2,3

override func viewDidLoad() { 
     //..... 

     let viewTapGestureRec = UITapGestureRecognizer(target: self, action: #selector(handleViewTap(_:))) 
     //this line is important 
     viewTapGestureRec.cancelsTouchesInView = false 
     self.view.addGestureRecognizer(viewTapGestureRec) 

     //..... 
    } 

    func handleViewTap(recognizer: UIGestureRecognizer) { 
     myTextField.resignFirstResponder() 
    } 
Các vấn đề liên quan