Cách loại bỏ bàn phím iOS theo lập trình khi nhấn phím quay lại


105

Tôi đã UITextFieldlập trình tạo UITextFieldmột thuộc tính của viewController. Tôi cần loại bỏ bàn phím bằng thao tác quay lại và chạm trên màn hình. Tôi đã có thể loại bỏ cảm ứng màn hình, nhưng nhấn quay lại không hoạt động.

Tôi đã thấy cách làm điều đó với bảng phân cảnh và bằng cách cấp phát và khởi tạo UITextFieldđối tượng trực tiếp mà không cần tạo nó dưới dạng thuộc tính. Có thể làm gì?

.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UITextFieldDelegate>

@property (strong, atomic) UITextField *username;

@end

.m

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    // Do any additional setup after loading the view, typically from a nib.
    
    self.view.backgroundColor = [UIColor blueColor];
    self.username = [[UITextField alloc] initWithFrame:CGRectMake(100, 25, 80, 20)];
    self.username.placeholder = @"Enter your username";
    self.username.backgroundColor = [UIColor whiteColor];
    self.username.borderStyle = UITextBorderStyleRoundedRect;
    if (self.username.placeholder != nil) {
        self.username.clearsOnBeginEditing = NO;
    }
    _username.delegate = self; 
    
    [self.view addSubview:self.username];
    [_username resignFirstResponder];
    
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    NSLog(@"touchesBegan:withEvent:");
    [self.view endEditing:YES];
    [super touchesBegan:touches withEvent:event];
}

@end

Câu trả lời:


265

Cách đơn giản là kết nối đại diện của UITextFieldvới self ( self.mytestField.delegate = self) và loại bỏ bàn phím trong phương thức textFieldShouldReturnsử dụng[textField resignFirstResponder];

Một cách khác để loại bỏ bàn phím như sau:

[self.view endEditing:YES];

Đặt [self.view endEditing:YES];ở nơi bạn muốn loại bỏ bàn phím (Sự kiện nút, Sự kiện chạm, v.v.).


Tuy nhiên, khi tôi kết nối đại biểu, tôi nhận được cảnh báo và / hoặc lỗi. Tôi đã thấy cách của bạn trước đây, nhưng vì một số lý do không thể làm cho nó hoạt động được. Các phương pháp này có được đưa vào viewDidLoad không?
noobsmcgoobs

1
Nếu bạn gặp lỗi khi cố gắng đặt đại biểu textField cho chính mình, thì có thể bạn chưa thêm UITextFieldDelegate vào định nghĩa lớp. Cụ thể ... lớp ViewController: UIViewController, UITextFieldDelegate {...
TimWhiting

29

Thêm một phương thức ủy quyền UITextFieldnhư sau:

@interface MyController : UIViewController <UITextFieldDelegate>

Và đặt textField.delegate = self;sau đó của bạn cũng thêm hai phương thức ủy quyền củaUITextField

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{   
    return YES;
}

// It is important for you to hide the keyboard
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}

Chúng ta nên thêm, rằng ở trên chỉ hoạt động, nếu dụng cụ điều khiển của bạn UITextFieldDelegate như vậy: @interface MyController : UIViewController <UITextFieldDelegate>
DerWOK

@iPatel Tôi đưa 2 phương thức đó vào và cũng thêm self.username.delegate = self và [self.username resignFirstResponder] trong viewDidLoad. Điều này hoạt động cho cả hai trường hợp tôi cần. Điều đó có bình thường không hay tôi đang sử dụng quá nhiều mã?
noobsmcgoobs

26

// Ẩn keyBoard bằng cách chạm vào nền trong chế độ xem

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [[self view] endEditing:YES];
}

24

chỉ cần sử dụng điều này nhanh chóng để loại bỏ bàn phím:

UIApplication.sharedApplication().sendAction("resignFirstResponder", to:nil, from:nil, forEvent:nil)

Swift 3

UIApplication.shared.sendAction(#selector(UIResponder.resign‌​FirstResponder), to: nil, from: nil, for: nil)

SWIFT 3UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
miff

17

SWIFT 4:

self.view.endEditing(true)

hoặc là

Đặt đại biểu của trường văn bản thành bộ điều khiển chế độ xem hiện tại và sau đó:

func textFieldShouldReturn(_ textField: UITextField) -> Bool {

    textField.resignFirstResponder()

    return true

}

Mục tiêu-C:

[self.view endEditing:YES];

hoặc là

Đặt đại biểu của trường văn bản thành bộ điều khiển chế độ xem hiện tại và sau đó:

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];

    return YES;
}

9

Trong App Delegate, bạn có thể viết

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self.window endEditing:YES];
}

sử dụng theo cách này, bạn không thể viết quá nhiều mã.


7

Cố gắng tìm hiểu về người phản hồi đầu tiên trong hệ thống phân cấp chế độ xem iOS. Khi trường văn bản của bạn trở nên hoạt động (hoặc bộ phản hồi đầu tiên) khi bạn chạm vào bên trong nó (hoặc chuyển nó vào tệp tin lộn xộn theo becomeFirstResponderlập trình), nó sẽ hiển thị bàn phím. Vì vậy, để loại bỏ trường văn bản của bạn khỏi vị trí phản hồi đầu tiên, bạn nên chuyển thông điệp resignFirstResponderđến trường đó.

[textField resignFirstResponder];

Và để ẩn bàn phím trên nút quay lại của nó, bạn nên triển khai phương thức ủy quyền của nó textFieldShouldReturn:và chuyển resignFirstResponderthông báo.

- (BOOL)textFieldShouldReturn:(UITextField *)textField{
    [textField resignFirstResponder];
    return YES;
}

7

Đây là những gì tôi sử dụng trong mã của mình. Nó hoạt động như một say mê!

Trong yourviewcontroller.h thêm:

@property (nonatomic) UITapGestureRecognizer *tapRecognizer;

Bây giờ trong tệp .m, hãy thêm cái này vào hàm ViewDidLoad của bạn:

- (void)viewDidLoad {
    [super viewDidLoad];

    //Keyboard stuff
    tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
    tapRecognizer.cancelsTouchesInView = NO;
    [self.view addGestureRecognizer:tapRecognizer];
}

Ngoài ra, hãy thêm chức năng này vào tệp .m:

- (void)handleSingleTap:(UITapGestureRecognizer *) sender
{
    [self.view endEditing:YES];
}

1
chỉ nhớ những hành động: @selector nên gọi tên cùng một phương pháp mà bạn endEditing: YES, trong trường hợp này "handleSingleTap:"
Marcos Rebouças

4

Để loại bỏ bàn phím sau khi bàn phím bật lên, có 2 trường hợp ,

  1. khi UITextField bên trong UIScrollView

  2. khi UITextField nằm ngoài UIScrollView

2. khi UITextField bên ngoài UIScrollView ghi đè phương thức trong lớp con UIViewController của bạn

bạn cũng phải thêm đại biểu cho tất cả UITextView

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self.view endEditing:YES];
}
  1. Trong chế độ xem cuộn, Chạm vào bên ngoài sẽ không kích hoạt bất kỳ sự kiện nào , vì vậy trong trường hợp đó, hãy sử dụng Trình nhận dạng cử chỉ nhấn , Kéo và thả một UITapGesture cho chế độ xem cuộn và tạo IBAction cho nó .

để tạo IBAction, nhấn ctrl + nhấp vào UITapGesture và kéo nó vào tệp .h của viewcontroller.

Ở đây tôi đã đặt tên tappedEvent làm tên hành động của mình

- (IBAction)tappedEvent:(id)sender {
      [self.view endEditing:YES];  }

abouve đưa ra Thông tin được lấy từ liên kết sau, vui lòng tham khảo để biết thêm thông tin hoặc liên hệ với tôi nếu bạn không hiểu dữ liệu abouve.

http://samwize.com/2014/03/27/dismiss-keyboard-when-tap-outside-a-uitextfield-slash-uitextview/


Cảm ơn. Câu trả lời của bạn đã giúp tôi ..!
Archit Kapoor

4

Đối với một nhóm UITextViews bên trong một ViewController:

Swift 3.0

for view in view.subviews {
    if view is UITextField {
        view.resignFirstResponder()
    }
}

Objective-C

// hide keyboard before dismiss
for (UIView *view in [self.view subviews]) {
    if ([view isKindOfClass:[UITextField class]]) {
        // no need to cast
        [view resignFirstResponder];
    }
}


3

Vì các thẻ chỉ cho biết iOS tôi sẽ đăng câu trả lời cho Swift 1.2 và iOs 8.4, hãy thêm chúng vào lớp nhanh bộ điều khiển chế độ xem của bạn:

// MARK: - Close keyboard when touching somewhere else
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {

    self.view.endEditing(true)

}

// MARK: - Close keyboard when return pressed
func textFieldShouldReturn(textField: UITextField!) -> Bool {

    textField.resignFirstResponder()

    return true
}
// MARK: -

Ngoài ra, đừng quên thêm UITextFieldDelegate trong khai báo lớp và đặt đại biểu trường văn bản của bạn thành tự (chế độ xem).


3

TRONG Swift 3

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        self.view.endEditing(true)
    }

HOẶC LÀ

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        if textField == yourtextfieldName
        {
            self.resignFirstResponder()
            self.view.endEditing(true)
        }
    }

2

Vì vậy, đây là những gì tôi đã làm để loại bỏ nó sau khi chạm vào nền hoặc quay lại. Tôi đã phải thêm ủy nhiệm = self trong viewDidLoad và sau đó là các phương thức ủy quyền sau đó trong tệp .m.

.h
#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UITextFieldDelegate>


@property (strong, atomic) UITextField *username;

@end

.m
- (void)viewDidLoad
{
    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

    self.view.backgroundColor = [UIColor blueColor];
    self.username = [[UITextField alloc] initWithFrame:CGRectMake(100, 25, 80, 20)];
    self.username.placeholder = @"Enter your username";
    self.username.backgroundColor = [UIColor whiteColor];
    self.username.borderStyle = UITextBorderStyleRoundedRect;
    if (self.username.placeholder != nil) {
        self.username.clearsOnBeginEditing = NO;
    }
    self.username.delegate = self;
    [self.username resignFirstResponder];
    [self.view addSubview:self.username];


}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    return YES;
}



- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}

@end

2

Chỉ cần sử dụng điều này trong Objective-C để loại bỏ bàn phím:

[[UIApplication sharedApplication].keyWindow endEditing:YES];

1

Trước tiên, bạn cần thêm textfield deletegete trong tệp .h. nếu không khai báo (BOOL)textFieldShouldReturn:(UITextField *)textFieldphương thức này không được gọi. vì vậy trước tiên hãy thêm đại biểu và viết mã ẩn bàn phím vào phương thức đó.

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}

thử cái này ..


0

Thêm đại diện: UITextFieldDelegate

@interface ViewController : UIViewController <UITextFieldDelegate>

và sau đó thêm phương thức ủy quyền này

// Điều này sẽ hoạt động hoàn hảo

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}

0
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.view.subviews enumerateObjectsUsingBlock:^(UIView* obj, NSUInteger idx, BOOL *stop) {
    if ([obj isKindOfClass:[UITextField class]]) {
        [obj resignFirstResponder];
    }
}];
}

Khi bạn sử dụng nhiều hơn thì một trường văn bản trong màn hình Với phương pháp này, bạn không cần phải đề cập đến trường văn bản mỗi lần như

[textField1 resignFirstResponder];
[textField2 resignFirstResponder];

0

Swift 2:

đây là những gì đã làm để làm mọi thứ!

bàn phím chặt chẽ với Donenút hoặc Touch outSide, Nextcho đi để đầu vào tiếp theo.

Đầu tiên Change TextFiled Return KeyĐể Nexttrong kịch bản này.

override func viewDidLoad() {
  txtBillIdentifier.delegate = self
  txtBillIdentifier.tag = 1
  txtPayIdentifier.delegate  = self
  txtPayIdentifier.tag  = 2

  let tap = UITapGestureRecognizer(target: self, action: "onTouchGesture")
  self.view.addGestureRecognizer(tap)

}

func textFieldShouldReturn(textField: UITextField) -> Bool {
   if(textField.returnKeyType == UIReturnKeyType.Default) {
       if let next = textField.superview?.viewWithTag(textField.tag+1) as? UITextField {
           next.becomeFirstResponder()
           return false
       }
   }
   textField.resignFirstResponder()
   return false
}

func onTouchGesture(){
    self.view.endEditing(true)
}

0

Nếu bạn không biết bộ điều khiển chế độ xem hiện tại hoặc chế độ xem văn bản, bạn có thể sử dụng Chuỗi phản hồi:

UIApplication.shared.sendAction(#selector(UIView.endEditing(_:)), to:nil, from:nil, for:nil)

0

nhanh chóng 3-4 tôi đã sửa như thế nào

func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
    return false
}

chỉ cần sao chép dán vào bất kỳ đâu trên lớp. Giải pháp này chỉ hoạt động nếu bạn muốn tất cả UItextfield hoạt động giống nhau, hoặc nếu bạn chỉ có một!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.