Return 키를 누를 때 프로그래밍 방식으로 키보드 iOS를 닫는 방법


105

나는 viewController의 속성을 UITextField프로그래밍 방식으로 만들었습니다 UITextField. 화면에 리턴과 터치로 키보드를 닫아야합니다. 화면 터치를 해제 할 수 있었지만 Return 키를 누르면 작동하지 않습니다.

스토리 보드를 사용하고 UITextField객체를 속성으로 생성하지 않고 직접 할당 및 초기화하는 방법을 보았습니다 . 할 수 있습니까?

.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UITextFieldDelegate>

@property (strong, atomic) UITextField *username;

@end

.미디엄

#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 ( self.mytestField.delegate = self) 에 연결하고 다음을 textFieldShouldReturn사용 하는 방법에서 키보드를 닫는 것입니다.[textField resignFirstResponder];

키보드를 닫는 또 다른 방법은 다음과 같습니다.

[self.view endEditing:YES];

넣어 [self.view endEditing:YES];키보드 (버튼 이벤트, 터치 이벤트 등)를 해고하고자하는 경우.


하지만 델리게이트를 연결하면 경고 및 / 또는 오류가 발생합니다. 나는 전에 당신의 방법을 보았지만 어떤 이유로 그것을 작동시킬 수 없습니다.이 메서드는 viewDidLoad에 들어 갈까요?
noobsmcgoobs

1
textField 델리게이트를 self로 설정하려고 할 때 오류가 발생했다면 클래스 정의에 UITextFieldDelegate를 추가하지 않았을 것입니다. 특히 ... class 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이 두 가지 방법을 넣고 viewDidLoad에 self.username.delegate = self와 [self.username resignFirstResponder]를 추가했습니다. 이것은 내가 필요한 두 시나리오 모두에서 작동합니다. 정상입니까 아니면 너무 많은 코드를 사용하고 있습니까?
noobsmcgoobs

26

//보기에서 배경을 터치하여 키보드 숨기기

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

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
action : @selector는 endEditing : YES를 수행하는 동일한 메서드 이름을 호출해야합니다.이 경우에는 "handleSingleTap :"
Marcos Reboucas 2015 년

4

키보드가 튀어 나온 후 키보드를 닫으려면 두 가지 경우가 있습니다 .

  1. UITextField가 UIScrollView 내부에 있을 때

  2. UITextField가 UIScrollView 외부에 있을 때

2. UITextField가 UIScrollView 외부에있는 경우 UIViewController 하위 클래스의 메서드를 재정의합니다.

모든 UITextView에 대한 델리게이트추가 해야합니다.

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self.view endEditing:YES];
}
  1. A의 스크롤 뷰, 태핑 외부의 어떤 이벤트가 발생하지 않습니다 그래서이 경우, 탭 제스처 인식기 사용 , 드래그 앤 드롭 UITapGesture 스크롤 뷰를하고 그것을 위해 IBAction를를 작성 .

IBAction을 만들려면 Ctrl 키를 누른 채 UITapGesture를 클릭하고 viewcontroller의 .h 파일로 드래그합니다.

여기에서는 tappedEvent를 내 작업 이름으로 지정했습니다.

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

abouve 주어진 정보는 다음 링크에서 파생되었습니다. 자세한 정보를 참조하거나 abouve 데이터를 이해하지 못하는 경우 저에게 연락하십시오.

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


감사. 당신의 대답이 도움이되었습니다 ..!
Archit Kapoor

4

UITextView내부 의 s 그룹의 경우 ViewController:

스위프트 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를 추가하고 텍스트 필드 위임을 self (뷰)로 설정하는 것을 잊지 마십시오.


3

스위프트 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

그래서 여기에 내가 배경을 만지거나 돌아온 후 해제하도록 한 것입니다. viewDidLoad에 delegate = self를 추가 한 다음 나중에 .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

먼저 .h 파일에 텍스트 필드 delegete를 추가해야합니다. (BOOL)textFieldShouldReturn:(UITextField *)textField이 메서드가 호출 되지 않음을 선언 하지 않으면 먼저 대리자를 추가하고 해당 메서드에 키보드 숨기기 코드를 작성합니다.

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

이거 한번 해봐..


0

대리인 추가 : 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

스위프트 2 :

이것은 모든 일을하기 위해 한 일입니다!

가까운 키보드 Done버튼을 누르거나 Touch outSide, Next다음 입력으로 이동합니다.

먼저 StoryBoard에서 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

현재보기 컨트롤러 또는 텍스트보기를 모르는 경우 응답자 체인을 사용할 수 있습니다.

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

0

신속한 3-4의 경우 나는 다음과 같이 수정했습니다.

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

수업의 아무 곳에 나 복사 붙여 넣기 만하면됩니다. 이 솔루션은 모든 UItextfield가 동일하게 작동하거나 하나만있는 경우에만 작동합니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.