Tôi biết rằng tôi cần nói với UITextField của mình từ chức phản hồi đầu tiên khi tôi muốn tháo bàn phím, nhưng tôi không biết làm thế nào để biết khi nào người dùng nhấn phím "Xong" trên bàn phím. Có một thông báo tôi có thể xem?
Tôi biết rằng tôi cần nói với UITextField của mình từ chức phản hồi đầu tiên khi tôi muốn tháo bàn phím, nhưng tôi không biết làm thế nào để biết khi nào người dùng nhấn phím "Xong" trên bàn phím. Có một thông báo tôi có thể xem?
Câu trả lời:
Tôi đặt đại biểu của lớp UITextField
tôi ViewController
.
Trong lớp đó tôi đã thực hiện phương pháp này như sau:
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
[textField resignFirstResponder];
return NO;
}
NO
thay vì YES
?
NO
bạn tránh thêm một dòng trở lại văn bản.
Nếu bạn kết nối sự kiện DidEndOnExit của trường văn bản với một hành động (IBAction) trong InterfaceBuilder, nó sẽ bị rối khi người dùng bỏ bàn phím (bằng phím quay lại) và người gửi sẽ tham chiếu đến UITextField đã kích hoạt sự kiện.
Ví dụ:
-(IBAction)userDoneEnteringText:(id)sender
{
UITextField theField = (UITextField*)sender;
// do whatever you want with this text field
}
Sau đó, trong InterfaceBuilder, liên kết sự kiện DidEndOnExit của trường văn bản với hành động này trên bộ điều khiển của bạn (hoặc bất cứ điều gì bạn đang sử dụng để liên kết các sự kiện từ UI). Bất cứ khi nào người dùng nhập văn bản và loại bỏ trường văn bản, bộ điều khiển sẽ được gửi tin nhắn này.
Bạn cũng có thể tạo một phương thức trong bộ điều khiển của bạn
-(IBAction)editingEnded:(id)sender{
[sender resignFirstResponder];
}
và sau đó trong Trình kiểm tra kết nối trong IB kết nối Sự kiện "Đã kết thúc khi thoát" với nó.
DidEndOnExit
sự kiện, bạn không cần phải gọi resignFirstResponder
. Bạn có thể kiểm tra điều này bằng cách đặt một điểm dừng tượng trưng [UIResponder resignFirstResponder]
. Lưu ý rằng ngay cả khi bạn không gọi resignFirstResponder, hệ thống vẫn được gọi bởi hệ thống. Điều này được giải thích trong (các) cuốn sách xuất sắc của Matt Neuburg: apeth.com/iOSBook/ Kẻ
kubi, cảm ơn Mã của bạn đã làm việc. Chỉ cần được rõ ràng (đối với người mới thích) như bạn nói, bạn phải thiết lập UITextField
's delegate
là tương đương với ViewController trong đó cư trú trường văn bản. Bạn có thể làm điều này bất cứ nơi nào bạn muốn. Tôi đã chọn viewDidLoad
phương pháp.
- (void)viewDidLoad
{
// sets the textField delegates to equal this viewController ... this allows for the keyboard to disappear after pressing done
daTextField.delegate = self;
}
delegate
ở đó. Bạn không cần phải làm điều này theo chương trình, như đã trình bày ở trên. Hoặc là cách tiếp cận hoạt động tốt.
Đây là một mẹo để có được hành vi sa thải bàn phím tự động mà không có mã nào cả. Trong ngòi bút, chỉnh sửa đối tượng proxy Phản hồi đầu tiên trong Trình kiểm tra danh tính, thêm hành động phản hồi đầu tiên mới; chúng ta hãy gọi nó dummy:
. Bây giờ hãy nối sự kiện Did End on Exit của trường văn bản vào dummy:
hành động của đối tượng proxy Phản hồi đầu tiên. Đó là nó! Do sự kiện Did End on Exit của trường văn bản hiện có cặp mục tiêu hành động, nên trường văn bản sẽ tự động loại bỏ bàn phím của nó khi người dùng chạm trở lại; và vì không có hình phạt nào cho việc không tìm thấy trình xử lý cho một tin nhắn được gửi lên chuỗi phản hồi, ứng dụng không bị sập mặc dù không có triển khai ở dummy:
bất cứ đâu.
Chỉ cần thêm
[textField endEditing:YES];
nơi bạn muốn tắt bàn phím và hiển thị giao diện bộ chọn.
Trong Swift, bạn có thể viết IBAction trong Trình điều khiển và đặt sự kiện Đã kết thúc khi thoát của trường văn bản thành hành động đó
@IBAction func returnPressed(sender: UITextField) {
self.view.endEditing(true)
}
Swift 4.2
và nó sẽ hoạt động 100%
import UIKit
class ViewController: UIViewController, UITextFieldDelegate {
@IBOutlet weak var textField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
self.textField.delegate = self
}
// hide key board when the user touches outside keyboard
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}
// user presses return key
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
}
Bạn cũng có thể dùng
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.yourTextField resignFirstResponder];
}
Tốt nhất nếu bạn có nhiều Uitextfield:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.view endEditing:YES];
}
Đây là những gì tôi phải làm để làm cho nó hoạt động và tôi nghĩ là cần thiết cho bất kỳ ai có Number Pad cho bàn phím (hoặc bất kỳ cái nào khác không có nút thực hiện:
Tôi đã tạo một hàm gọi là
-(IBAction)backgroundIsTapped:(id)sender
Điều này cũng được định nghĩa trong tệp .h.
Sau này, tôi đã liên kết với bit 'chạm xuống' cho ViewContoder trong Trình tạo giao diện.
Trong chức năng 'nền được khai thác', tôi đặt điều này:
[answerField resignFirstResponder];
Chỉ cần nhớ thay đổi 'answerField' thành tên của UITextField mà bạn muốn xóa bàn phím khỏi (rõ ràng là đảm bảo UITextField của bạn được xác định như bên dưới :)
IBOutlet UITextField * <nameoftextfieldhere>;
Tôi biết chủ đề này có thể đã chết từ lâu ... nhưng tôi hy vọng điều này sẽ giúp được ai đó, ở đâu đó!
Bạn sẽ nhận thấy rằng phương thức "textFieldShouldReturn" cung cấp đối tượng trường văn bản đã nhấn phím DONE. Nếu bạn đặt TAG, bạn có thể bật trường văn bản đó. Hoặc bạn có thể theo dõi và so sánh con trỏ của đối tượng với một số giá trị thành viên được lưu bởi người tạo.
Cách tiếp cận của tôi là như thế này để tự học:
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
NSLog(@"%s", __FUNCTION__);
bool fDidResign = [textField resignFirstResponder];
NSLog(@"%s: did %resign the keyboard", __FUNCTION__, fDidResign ? @"" : @"not ");
return fDidResign;
}
Trong khi đó, tôi đặt bài kiểm tra "xác nhận" từ chối việc từ chức sau đây. Nó chỉ mang tính minh họa, vì vậy nếu người dùng gõ KHÔNG! vào lĩnh vực này, nó sẽ không loại bỏ. Hành vi là như tôi muốn, nhưng trình tự đầu ra không như tôi mong đợi.
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
NSLog(@"%s", __FUNCTION__);
if( [[textField text] isEqualToString:@"NO!"] ) {
NSLog(@"%@", textField.text);
return NO;
} else {
return YES;
}
}
Sau đây là đầu ra NSLog của tôi cho từ chối này theo sau là sự chấp nhận. Bạn sẽ nhận thấy rằng tôi đang trả lại kết quả của việc từ chức, nhưng tôi dự kiến nó sẽ trả lại SAI cho tôi để báo cáo lại cho người gọi?! Ngoài ra, nó có hành vi cần thiết.
13.313 StudyKbd [109: 207] - [StudyKbdViewControll textFieldShouldReturn:] 13.320 StudyKbd [109: 207] - [StudyKbdViewControll textFieldShouldEndEditing:] 13.327 Nghiên cứuKbd [109: 207] KHÔNG! 13.333 StudyKbd [109: 207] - [StudyKbdViewControll textFieldShouldReturn:]: đã từ chức bàn phím 59.891 StudyKbd [109: 207] - [StudyKbdViewControll textFieldShouldReturn:] 59.897 StudyKbd [109: 207] - [StudyKbdViewControll textFieldShouldEndEditing:] 59.917 StudyKbd [109: 207] - [StudyKbdViewControll DoneEditText]: NO 59.928 StudyKbd [109: 207] - [StudyKbdViewControll textFieldShouldReturn:]: đã từ chức bàn phím
Dưới đây là một cách khá rõ ràng để kết thúc phiên bản với Phím Trả về hoặc chạm vào nền.
Trong Trình tạo giao diện, nhúng các trường của bạn vào chế độ xem lớp UIFormView
Lớp học này là gì:
Đây là mã:
Giao diện
#import <UIKit/UIKit.h>
@interface UIFormView : UIView<UITextFieldDelegate>
-(BOOL)textFieldValueIsValid:(UITextField*)textField;
-(void)endEdit;
@end
Thực hiện
#import "UIFormView.h"
@implementation UIFormView
{
UITextField* currentEditingTextField;
}
// Automatically register fields
-(void)addSubview:(UIView *)view
{
[super addSubview:view];
if ([view isKindOfClass:[UITextField class]]) {
if ( ![(UITextField*)view delegate] ) [(UITextField*)view setDelegate:self];
}
}
// UITextField Protocol
-(void)textFieldDidBeginEditing:(UITextField *)textField
{
currentEditingTextField = textField;
}
-(void)textFieldDidEndEditing:(UITextField *)textField
{
currentEditingTextField = NULL;
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
[self endEdit];
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
if ([self textFieldValueIsValid:textField]) {
[self endEdit];
return YES;
} else {
return NO;
}
}
// Own functions
-(void)endEdit
{
if (currentEditingTextField) {
[currentEditingTextField endEditing:YES];
currentEditingTextField = NULL;
}
}
// Override this in your subclass to handle eventual values that may prevent validation.
-(BOOL)textFieldValueIsValid:(UITextField*)textField
{
return YES;
}
@end
Bằng cách phân lớp biểu mẫu và ghi đè
textFieldValueIsValid:
phương thức, bạn có thể tránh kết thúc phiên bản nếu giá trị không chính xác cho trường đã cho.
Nếu một trường có một đại biểu được đặt trong Trình tạo giao diện, thì biểu mẫu không thay đổi nó. Tôi không thấy nhiều lý do để đặt một đại biểu khác cho một lĩnh vực cụ thể, nhưng tại sao lại không
Có nhiều cách để cải thiện lớp dạng xem biểu mẫu này - Đính kèm một đại biểu, thực hiện một số bố cục, xử lý khi bàn phím bao phủ một trường (sử dụng khung currentEditingTextField), tự động bắt đầu phiên bản cho trường tiếp theo, ...
Cá nhân tôi giữ nó trong khuôn khổ của mình và luôn phân lớp nó để thêm các tính năng, nó thường khá hữu ích "như hiện tại".
Tôi hy vọng nó sẽ giúp. Chúc mừng tất cả
nếu bạn muốn tất cả chỉnh sửa trong UIViewControll bạn có thể sử dụng.
[[self view]endEditing:YES];
và nếu bạn muốn loại bỏ ẩn bàn phím UITextField vuông góc thì hãy sử dụng.
1.add ủy nhiệm trong viewcontroll.h của bạn
<UITextFieldDelegate>
làm cho phái đoàn không thể đến trường văn bản của bạn.
self.yourTextField.delegate = tự;
thêm phương thức này vào trình điều khiển khung nhìn của bạn.
- (BOOL) textFieldShouldEndEditing: (UITextField *) textField {[textField resignFirstResponder]; trả về CÓ;}
Lập trình đặt đại biểu của UITextField trong swift 3
Triển khai UITextFieldDelegate trong tệp ViewContoder.Swift của bạn (ví dụ: lớp ViewContoder: UIViewContoder, UITextFieldDelegate {)
lazy var firstNameTF: UITextField = {
let firstname = UITextField()
firstname.placeholder = "FirstName"
firstname.frame = CGRect(x:38, y: 100, width: 244, height: 30)
firstname.textAlignment = .center
firstname.borderStyle = UITextBorderStyle.roundedRect
firstname.keyboardType = UIKeyboardType.default
firstname.delegate = self
return firstname
}()
lazy var lastNameTF: UITextField = {
let lastname = UITextField()
lastname.placeholder = "LastName"
lastname.frame = CGRect(x:38, y: 150, width: 244, height: 30)
lastname.textAlignment = .center
lastname.borderStyle = UITextBorderStyle.roundedRect
lastname.keyboardType = UIKeyboardType.default
lastname.delegate = self
return lastname
}()
lazy var emailIdTF: UITextField = {
let emailid = UITextField()
emailid.placeholder = "EmailId"
emailid.frame = CGRect(x:38, y: 200, width: 244, height: 30)
emailid.textAlignment = .center
emailid.borderStyle = UITextBorderStyle.roundedRect
emailid.keyboardType = UIKeyboardType.default
emailid.delegate = self
return emailid
}()
// Đánh dấu: - xử lý văn bản ủy nhiệm ..
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
view.endEditing(true)
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
if textField == firstNameTF {
lastNameTF.becomeFirstResponder()
}
else if textField == lastNameTF {
emailIdTF.becomeFirstResponder()
}
else {
view.emailIdTF(true)
}
return true
}
Tạo một bảng ẩn chức năng và liên kết nó với trường văn bản trong tệp .xib và chọn DidEndOnExit
-(IBAction)Hidekeyboard
{
textfield_name.resignFirstResponder;
}
Nếu bạn đã tạo chế độ xem bằng Trình tạo giao diện, hãy sử dụng cách sau Chỉ cần tạo phương thức,
-(IBAction)dismissKeyboard:(id)sender
{
[sender resignFirstResponder];
}
Chỉ cần nhấp chuột phải vào trường văn bản trong dạng xem và đặt sự kiện là Đã kết thúc khi thoát và nối nó với phương thức "từ chối".
Hướng dẫn tốt nhất cho người mới bắt đầu là "Phát triển iPhone và iPad đầu tiên, Phiên bản 2"
//====================================================
// textFieldShouldReturn:
//====================================================
-(BOOL) textFieldShouldReturn:(UITextField*) textField {
[textField resignFirstResponder];
if(textField.returnKeyType != UIReturnKeyDone){
[[textField.superview viewWithTag: self.nextTextField] becomeFirstResponder];
}
return YES;
}
Bất cứ ai đang tìm kiếm Swift 3
1) Đảm bảo rằng Đại biểu UITextField của bạn được kết nối với ViewContoder của bạn trong Storyboard
2) Triển khai UITextFieldDelegate trong tệp ViewContoder.Swift của bạn (ví dụ: lớp ViewContoder: UIViewControll, UITextFieldDelegate {)
3) Sử dụng phương pháp đại biểu dưới đây
func textFieldShouldReturn(textField: UITextField) -> Bool {
textField.resignFirstResponder()
return false }
Đây là cách tôi loại bỏ bàn phím trong Swift 4.2 và nó hoạt động với tôi:
override func viewDidLoad() {
super.viewDidLoad()
let tap = UITapGestureRecognizer(target: self, action:
#selector(dismissKeyboard))
view.addGestureRecognizer(tap)
}
@objc func dismissKeyboard (_ sender: UITapGestureRecognizer) {
numberField.resignFirstResponder()
}
Swift 3, iOS 9+
@IBAction private func noteFieldDidEndOnExit(_ sender: UITextField) {}
CẬP NHẬT: Nó vẫn hoạt động tốt cho tôi. Tôi nghĩ rằng anh chàng dành câu trả lời này chỉ không hiểu rằng anh ta cần phải ràng buộc hành động này với UITextField tại bảng phân cảnh.