วิธีปิดแป้นพิมพ์ iOS โดยทางโปรแกรมเมื่อกด return


105

ฉันสร้างUITextFieldโปรแกรมโดยUITextFieldใช้คุณสมบัติของ viewController ฉันต้องการปิดแป้นพิมพ์ด้วยการส่งคืนและการสัมผัสบนหน้าจอ ฉันสามารถสัมผัสหน้าจอเพื่อปิดได้ แต่การกดย้อนกลับไม่ทำงาน

ฉันเคยเห็นวิธีการทำสตอรีบอร์ดและการจัดสรรและกำหนดค่าเริ่มต้นของUITextFieldวัตถุโดยตรงโดยไม่ต้องสร้างเป็นคุณสมบัติ เป็นไปได้ที่จะทำ?

.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

คำตอบ:


265

วิธีง่ายๆคือเชื่อมต่อผู้รับมอบสิทธิ์UITextFieldกับตนเอง ( self.mytestField.delegate = self) และปิดแป้นพิมพ์ในวิธีการtextFieldShouldReturnโดยใช้[textField resignFirstResponder];

อีกวิธีในการปิดแป้นพิมพ์มีดังต่อไปนี้:

[self.view endEditing:YES];

วาง[self.view endEditing:YES];ตำแหน่งที่คุณต้องการปิดแป้นพิมพ์ (เหตุการณ์ปุ่มเหตุการณ์สัมผัส ฯลฯ )


เมื่อฉันเชื่อมต่อกับผู้รับมอบสิทธิ์ฉันได้รับคำเตือนและ / หรือข้อผิดพลาด ฉันเคยเห็นวิธีของคุณมาก่อน แต่ด้วยเหตุผลบางอย่างไม่สามารถใช้งานได้วิธีการเหล่านี้จะเข้าสู่ viewDidLoad หรือไม่?
noobsmcgoobs

1
หากคุณได้รับข้อผิดพลาดเมื่อคุณพยายามตั้งค่าผู้รับมอบสิทธิ์ textField เป็นตนเองแสดงว่าคุณอาจไม่ได้เพิ่ม UITextFieldDelegate ลงในนิยามคลาส โดยเฉพาะ ... คลาส ViewController: UIViewController, UITextFieldDelegate {...
TimWhiting

29

เพิ่มวิธีการมอบหมายUITextFieldเช่นนี้:

@interface MyController : UIViewController <UITextFieldDelegate>

และตั้งค่าtextField.delegate = self;จากนั้นเพิ่มวิธีการมอบหมายสองวิธีUITextField

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

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

เราควรเพิ่มว่าข้างต้นใช้งานได้เท่านั้นหากคอนโทรลเลอร์ของคุณใช้ UITextFieldDelegate ดังนี้: @interface MyController : UIViewController <UITextFieldDelegate>
DerWOK

@iPatel ฉันใส่ 2 วิธีเหล่านั้นไว้และยังเพิ่ม self.username.delegate = self และ [self.username goodbyeFirstResponder] ใน viewDidLoad สิ่งนี้ใช้ได้กับทั้งสองสถานการณ์ที่ฉันต้องการ เป็นเรื่องปกติหรือฉันใช้รหัสมากเกินไป?
noobsmcgoobs


24

เพียงใช้สิ่งนี้อย่างรวดเร็วเพื่อปิดแป้นพิมพ์:

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

สวิฟต์ 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)

หรือ

ตั้งค่าผู้รับมอบสิทธิ์ของฟิลด์ข้อความเป็นวิวคอนโทรลเลอร์ปัจจุบันจากนั้น:

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

    textField.resignFirstResponder()

    return true

}

วัตถุประสงค์ -C:

[self.view endEditing:YES];

หรือ

ตั้งค่าผู้รับมอบสิทธิ์ของฟิลด์ข้อความเป็นวิวคอนโทรลเลอร์ปัจจุบันจากนั้น:

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

    return YES;
}

9

ใน App Delegate คุณสามารถเขียน

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

ใช้วิธีนี้คุณไม่สามารถเขียนโค้ดมากเกินไป


7

ลองทำความเข้าใจเกี่ยวกับลำดับชั้นของการตอบกลับครั้งแรกของ iOS เมื่อช่องข้อความของคุณเปิดใช้งาน (หรือตัวตอบกลับแรก) เมื่อคุณสัมผัสภายใน (หรือส่งข้อความไปตามbecomeFirstResponderโปรแกรม) จะแสดงแป้นพิมพ์ ดังนั้นหากต้องการลบช่องข้อความของคุณจากการเป็นผู้ตอบกลับคนแรกคุณควรส่งข้อความresignFirstResponderไปที่นั่น

[textField resignFirstResponder];

และหากต้องการซ่อนแป้นพิมพ์บนปุ่มย้อนกลับคุณควรใช้วิธีการมอบสิทธิ์textFieldShouldReturn:และส่งresignFirstResponderข้อความ

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

7

นี่คือสิ่งที่ฉันใช้ในรหัสของฉัน ใช้งานได้เหมือนมีเสน่ห์!

ใน yourviewcontroller.h เพิ่ม:

@property (nonatomic) UITapGestureRecognizer *tapRecognizer;

ตอนนี้ในไฟล์. m ให้เพิ่มสิ่งนี้ในฟังก์ชัน ViewDidLoad ของคุณ:

- (void)viewDidLoad {
    [super viewDidLoad];

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

นอกจากนี้ให้เพิ่มฟังก์ชันนี้ในไฟล์. m:

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

1
เพียงจำการกระทำ: @selector ควรเรียกชื่อเมธอดเดียวกันกับที่คุณทำ endEditing: ใช่ในกรณีนี้ "handleSingleTap:"
Marcos Reboucas

4

ในการปิดแป้นพิมพ์หลังจากที่แป้นพิมพ์โผล่ขึ้นมามี2 กรณีคือ

  1. เมื่อ UITextField อยู่ภายใน UIScrollView

  2. เมื่อ UITextField อยู่นอก UIScrollView

2. เมื่อ UITextField อยู่นอก UIScrollView จะแทนที่เมธอดในคลาสย่อย UIViewController ของคุณ

คุณต้องเพิ่มผู้รับมอบสิทธิ์สำหรับ UITextView ทั้งหมดด้วย

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self.view endEditing:YES];
}
  1. ในมุมมองเลื่อนแตะนอกจะไม่เหตุการณ์ใด ๆดังนั้นในกรณีที่ใช้แตะท่าทางลายมือลากและวางUITapGestureสำหรับมุมมองเลื่อนและสร้าง IBAction สำหรับมัน

ในการสร้าง IBAction ให้กด ctrl + คลิก UITapGesture แล้วลากไปที่ไฟล์. h ของ viewcontroller

ที่นี่ฉันตั้งชื่อ tappedEvent เป็นชื่อการกระทำของฉัน

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

ข้อมูลที่ได้รับจากลิงค์ต่อไปนี้โปรดดูข้อมูลเพิ่มเติมหรือติดต่อฉันหากคุณไม่เข้าใจข้อมูลที่มีอยู่

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


ขอบคุณ. คำตอบของคุณช่วยฉัน .. !
Archit Kapoor

4

สำหรับกลุ่มUITextViewภายใน a ViewController:

Swift 3.0

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

วัตถุประสงค์ -C

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


3

เนื่องจากแท็กบอกเฉพาะ iOS ฉันจะโพสต์คำตอบสำหรับ Swift 1.2 และ iOs 8.4 ให้เพิ่มสิ่งเหล่านี้ในคลาส swift ตัวควบคุมมุมมองของคุณ:

// 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: -

นอกจากนี้อย่าลืมเพิ่ม UITextFieldDelegate ในการประกาศคลาสและตั้งค่าฟิลด์ข้อความของคุณที่มอบหมายให้ตนเอง (มุมมอง)


3

ใน Swift 3

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

หรือ

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

2

นี่คือสิ่งที่ฉันทำเพื่อให้ปิดหลังจากแตะพื้นหลังหรือย้อนกลับ ฉันต้องเพิ่ม delegate = self ใน viewDidLoad จากนั้นวิธีการมอบสิทธิ์ในไฟล์. 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

เพียงใช้สิ่งนี้ใน Objective-C เพื่อปิดแป้นพิมพ์:

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

1

ก่อนอื่นคุณต้องเพิ่ม textfield delegete ในไฟล์. h ถ้าไม่ประกาศว่า (BOOL)textFieldShouldReturn:(UITextField *)textFieldวิธีนี้ไม่ถูกเรียกดังนั้นก่อนอื่นให้เพิ่มผู้รับมอบสิทธิ์และเขียนรหัสซ่อนแป้นพิมพ์ลงในวิธีนั้น

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

ลองอันนี้..


0

เพิ่ม Delegate: UITextFieldDelegate

@interface ViewController : UIViewController <UITextFieldDelegate>

จากนั้นเพิ่มวิธีการมอบสิทธิ์นี้

// สิ่งนี้ควรทำงานได้อย่างสมบูรณ์

- (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];
    }
}];
}

เมื่อคุณใช้ฟิลด์ข้อความมากกว่าหนึ่งฟิลด์ในหน้าจอด้วยวิธีนี้คุณไม่จำเป็นต้องพูดถึงฟิลด์ข้อความทุกครั้งเช่น

[textField1 resignFirstResponder];
[textField2 resignFirstResponder];

0

Swift 2:

นี่คือสิ่งที่ทำได้ทุกสิ่ง!

ใกล้แป้นพิมพ์ที่มีDoneปุ่มหรือการTouch outSide, Nextสำหรับการเดินทางเพื่อป้อนต่อไป

เปลี่ยน TextFiled Return KeyการNextในสตอรี่บอร์ด

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

หากคุณไม่รู้จักตัวควบคุมมุมมองปัจจุบันหรือมุมมองข้อความคุณสามารถใช้ Responder Chain:

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

0

สำหรับ swift 3-4ฉันคงชอบ

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

เพียงแค่คัดลอกวางที่ใดก็ได้ในชั้นเรียน วิธีนี้ใช้ได้ผลถ้าคุณต้องการให้ UItextfield ทั้งหมดทำงานเหมือนเดิมหรือถ้าคุณมีเพียงอันเดียว!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.