development

키보드를 해제하는 쉬운 방법?

big-blog 2020. 2. 26. 07:56
반응형

키보드를 해제하는 쉬운 방법?


테이블의 많은 테이블 셀에 상당히 많은 컨트롤이 흩어져 있으며 모든 컨트롤을 반복하고 첫 번째 응답자로 모두 사임하지 않고 키보드를 해제하는 더 쉬운 방법이 있는지 궁금합니다. 질문은 .. 키보드의 현재 첫 번째 응답자를 어떻게 얻습니까?


시험:

[self.view endEditing:YES];

현재 편집중인보기가 첫 번째 응답자 상태를로 사임하도록 강제 할 수 있습니다 [view endEditing:YES]. 키보드가 숨겨집니다.

달리 -[UIResponder resignFirstResponder], -[UIView endEditing:]현재 첫 번째로 반응을 찾아 파단 통해 검색합니다. 따라서 최상위 뷰 (예 :) self.view전송할 UIViewController수 있으며 올바른 작업을 수행합니다.

(이 답변에는 이전에 작동했지만 필요한 것보다 더 복잡한 몇 가지 다른 솔루션이 포함되어 있습니다. 혼란을 피하기 위해 제거했습니다.)


응용 프로그램에 대상이 지정되지 않은 작업을 보낼 수 있으며, 현재 첫 번째 응답자 상태가 어떤 뷰인지 걱정할 필요없이 언제든지 첫 번째 응답자를 사임합니다.

목표 -C :

[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil];

스위프트 3.0 :

UIApplication.shared.sendAction(#selector(resignFirstResponder), to: nil, from: nil, for: nil)

Mac OS X에서는 메뉴 명령으로 대상이 지정되지 않은 작업이 일반적이며, iOS에서 해당 작업이 사용됩니다.


솔직히 말해서, 여기에 제안 된 솔루션에 대해서는 미치지 않습니다. TapGestureRecognizer를 사용하여 문제의 핵심이라고 생각하는 좋은 방법을 찾았습니다. 키보드 이외의 것을 클릭하면 키보드를 닫습니다.

  1. viewDidLoad에서 키보드 알림을 수신하고 UITapGestureRecognizer를 작성하도록 등록하십시오.

    NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
    
    [nc addObserver:self selector:@selector(keyboardWillShow:) name:
    UIKeyboardWillShowNotification object:nil];
    
    [nc addObserver:self selector:@selector(keyboardWillHide:) name:
    UIKeyboardWillHideNotification object:nil];
    
    tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self
    action:@selector(didTapAnywhere:)];
    
  2. 키보드 표시 / 숨기기 응답자를 추가하십시오. 여기에서 TapGestureRecognizer를 UIView에 추가하고 제거하면 탭할 때 키보드가 사라집니다. 참고 : 모든 하위 뷰 또는 컨트롤에 추가 할 필요는 없습니다.

    -(void) keyboardWillShow:(NSNotification *) note {
        [self.view addGestureRecognizer:tapRecognizer];
    }
    
    -(void) keyboardWillHide:(NSNotification *) note
    {
        [self.view removeGestureRecognizer:tapRecognizer];
    }
    
  3. TapGestureRecognizer는 탭을 받으면 함수를 호출하며 다음과 같이 키보드를 닫을 수 있습니다.

    -(void)didTapAnywhere: (UITapGestureRecognizer*) recognizer {    
        [textField resignFirstResponder];
    }
    

이 솔루션의 좋은 점은 스 와이프하지 않고 탭만 필터링한다는 것입니다. 따라서 키보드 위에서 내용을 스크롤하면 스 와이프해도 여전히 스크롤되어 키보드가 표시된 상태로 유지됩니다. 키보드가 사라진 후 제스처 인식기를 제거하면 나중에보기의 탭이 정상적으로 처리됩니다.


한 곳에서 코드를 추가하여 모든 텍스트 필드 return에서 키보드를 치울 수있는 솔루션입니다 (따라서 각 텍스트 필드에 핸들러를 추가하지 않아도 됨).


이 시나리오를 고려하십시오.

나는이 viewcontroller두 텍스트 필드 (사용자 이름 및 암호)와 함께합니다. 그리고 viewcontroller구현의 UITextFieldDelegate프로토콜

viewDidLoad 에서이 작업을 수행합니다.

- (void)viewDidLoad 
{
    [super viewDidLoad];

    username.delegate = self;
    password.delegate = self;
}

뷰 컨트롤러는 다음과 같은 선택적 방법을 구현합니다.

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

그리고 당신이있는 텍스트 필드에 관계없이 return키보드 를 두 드리 자마자 사라집니다!

귀하의 경우 모든 텍스트 필드의 대리자를 self로 설정하고 구현하는 한 동일하게 작동합니다. textFieldShouldReturn


더 나은 방법은 무언가 "훔친"첫 번째 응답자 상태를 유지하는 것입니다.

UIApplication은 UIResponder의 서브 클래스이므로 다음을 시도 할 수 있습니다.

[[UIApplication sharedApplication] becomeFirstResponder]
[[UIApplication sharedApplication] resignFirstResponder]

실패하면 크기가 0 인 프레임으로 새 UITextField를 만들고 어딘가에 뷰에 추가하고 비슷한 것을 수행하십시오 (사임이 됨).


유틸리티 클래스에서 이것을 제거하십시오.

+ (void)dismissKeyboard {
    [self globalResignFirstResponder];
}

+ (void) globalResignFirstResponder {
    UIWindow * window = [[UIApplication sharedApplication] keyWindow];
    for (UIView * view in [window subviews]){
        [self globalResignFirstResponderRec:view];
    }
}

+ (void) globalResignFirstResponderRec:(UIView*) view {
    if ([view respondsToSelector:@selector(resignFirstResponder)]){
        [view resignFirstResponder];
    }
    for (UIView * subview in [view subviews]){
        [self globalResignFirstResponderRec:subview];
    }
}

@Nicholas Riley & @Kendall Helmstetter Geln & @cannyboy :

절대적으로 훌륭합니다!

감사합니다.

이 스레드에서 당신의 조언과 다른 사람들의 조언을 고려할 때, 이것은 내가 한 일입니다.

사용될 때의 모습 :

[[self appDelegate] dismissKeyboard]; (참고 : NSD에 appDelegate를 추가하여 어디서나 사용할 수 있습니다)

후드 아래의 모습 :

- (void)dismissKeyboard 
{
    UITextField *tempTextField = [[[UITextField alloc] initWithFrame:CGRectZero] autorelease];
    tempTextField.enabled = NO;
    [myRootViewController.view addSubview:tempTextField];
    [tempTextField becomeFirstResponder];
    [tempTextField resignFirstResponder];
    [tempTextField removeFromSuperview];
}

편집하다

에 대한 내 답변 수정 tempTextField.enabled = NO;. 텍스트 필드를 사용 중지하면 앱 전체에서 이러한 알림에 의존하는 경우 키보드 알림이 전송 되지 UIKeyboardWillShowNotification않고 차단 UIKeyboardWillHideNotification됩니다.


사용자가 UITextField 또는 키보드 외부 화면의 아무 곳이나 터치 할 때 iOS에서 키보드를 해제하는 방법에 대한 빠른 팁. iOS 키보드가 차지할 수있는 공간을 고려할 때 사용자가 키보드를 해제 할 수있는 쉽고 직관적 인 방법을 사용하는 것이 좋습니다.

여기 링크가 있습니다


iOS 문서에서 쉽게 찾을 수 없기 때문에 여기에 지나치게 복잡한 답변이 많이 있습니다. JosephH는 바로 위에있었습니다.

[[view window] endEditing:YES];

Meagar의 답변보다 훨씬 간단

덮어 쓰기 touchesBegan:withEvent:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [textField resignFirstResponder];`
}

이 중 dismiss the keyboard아무 곳이나 터치하면됩니다 background.


내 코드에서 사용하는 것이 있습니다. 그것은 매력처럼 작동합니다!

yourviewcontroller.h에서 다음을 추가하십시오.

@property (nonatomic) UITapGestureRecognizer *tapRecognizer;

이제 .m 파일에서 이것을 ViewDidLoad 함수에 추가하십시오.

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

또한이 기능을 .m 파일에 추가하십시오.

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

뷰 컨트롤러의 헤더 파일 <UITextFieldDelegate>에서 UITextField 델리게이트 프로토콜을 준수하도록 컨트롤러 인터페이스의 정의에 추가 하십시오 ...

@interface someViewController : UIViewController <UITextFieldDelegate>

... 컨트롤러의 구현 파일 (.m)에서 다음 메소드를 추가하거나 viewDidLoad 메소드가 이미있는 경우 그 내부의 코드를 추가하십시오.

- (void)viewDidLoad
{
    // Do any additional setup after loading the view, typically from a nib.
    self.yourTextBox.delegate = self;
}

... 그런 다음 yourTextBox를 실제 텍스트 필드에 연결하십시오.

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField 
{
    if (theTextField == yourTextBox) {
        [theTextField resignFirstResponder];
    }
    return YES;
}

endEditing:하위 클래스 인 작업 창으로 보내야 합니다.UIView

[[UIApplication sharedApplication].windows.firstObject endEditing:NO];

UITableView 및 UIScrollView에서 키보드를 해제하는 가장 좋은 방법은 다음과 같습니다.

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag

신속한 3에서는 다음을 수행 할 수 있습니다

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

Jeremy의 답변이 저에게 효과적이지 않았습니다. 모달 대화 상자가있는 탭보기에 탐색 스택이 있었기 때문에 생각합니다. 나는 지금 다음을 사용하고 있으며 나를 위해 일하고 있지만 마일리지는 다를 수 있습니다.

 // dismiss keyboard (mostly macro)
[[UIApplication sharedApplication].delegate dismissKeyboard]; // call this in your to app dismiss the keybaord

// --- dismiss keyboard (in indexAppDelegate.h) (mostly macro)
- (void)dismissKeyboard;

// --- dismiss keyboard (in indexAppDelegate.m) (mostly macro)
// do this from anywhere to dismiss the keybard
- (void)dismissKeyboard {    // from: http://stackoverflow.com/questions/741185/easy-way-to-dismiss-keyboard

    UITextField *tempTextField = [[UITextField alloc] initWithFrame:CGRectZero];

    UIViewController *myRootViewController = <#viewController#>; // for simple apps (INPUT: viewController is whatever your root controller is called.  Probably is a way to determine this progragrammatically)
    UIViewController *uivc;
    if (myRootViewController.navigationController != nil) { // for when there is a nav stack
        uivc = myRootViewController.navigationController;
    } else {
        uivc = myRootViewController;
    }

    if (uivc.modalViewController != nil) { // for when there is something modal
        uivc = uivc.modalViewController;
    } 

    [uivc.view  addSubview:tempTextField];

    [tempTextField becomeFirstResponder];
    [tempTextField resignFirstResponder];
    [tempTextField removeFromSuperview];
    [tempTextField release];

}

경우에 따라 UIViewController disablesAutomaticKeyboardDismissal을 재정의해야 할 수도 있습니다. UINavigationController가있는 경우이를 수행해야 할 수도 있습니다.


텍스트 필드 서브 클래스 및 텍스트 뷰

서브 클래스 에서이 코드를 넣으십시오.

-(void)conformsToKeyboardDismissNotification{

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dismissKeyBoard) name:KEYBOARD_DISMISS object:nil];
}

-(void)deConformsToKeyboardDismissNotification{

    [[NSNotificationCenter defaultCenter] removeObserver:self name:KEYBOARD_DISMISS object:nil];
}

- (void)dealloc{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [self resignFirstResponder];
}

텍스트 필드 델리게이트에서 (텍스트 뷰 델리게이트와 유사)

-(void)textFieldDidBeginEditing:(JCPTextField *)textField{
     [textField conformsToKeyboardDismissNotification];
}


- (void)textFieldDidEndEditing:(JCPTextField *)textField{
    [textField deConformsToKeyboardDismissNotification];
}

모든 설정 .. 이제 코드의 어느 곳에서나 알림을 게시하십시오. 모든 키보드를 사임합니다.


그리고 신속하게 우리는 할 수 있습니다

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

키보드가 나타난 후 키보드를 닫으려면 2 가지 경우가 있습니다 .

  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/


개인 API 호출을 사용하지 않고 프로그래밍 방식으로 키보드를 해제하는 "전역"방법이 없다는 점이 싫습니다. 나는 종종 어떤 객체가 첫 번째 응답자인지 알지 못하고 프로그래밍 방식으로 키보드를 해제해야합니다. selfObjective-C 런타임 API를 사용하여 검사하고 모든 속성을 열거하고 유형의 속성을 가져 와서 메시지를 UITextField보내는 데 의존했습니다 resignFirstResponder.

이렇게하기가 어렵지 않아야합니다 ...


예쁘지는 않지만 응답자가 무엇인지 모르는 경우 firstResponder를 사임하는 방법은 다음과 같습니다.

IB 또는 프로그래밍 방식으로 UITextField를 만듭니다. 그것을 숨기십시오. IB에서 작성한 경우 코드와 연결하십시오. 그런 다음 키보드를 닫으려면 응답자를 보이지 않는 텍스트 필드로 전환하고 즉시 서명을 취소하십시오.

  [self.invisibleField becomeFirstResponder];
  [self.invisibleField resignFirstResponder];

하위 뷰를 반복적으로 반복하고 모든 UITextField의 배열을 저장 한 다음 반복하여 사임 할 수 있습니다.

정말 좋은 해결책은 아니지만, 특히 많은 서브 뷰가있는 경우 간단한 앱의 경우 트릭을 수행해야합니다.

나는 이것을 훨씬 더 복잡하지만 성능이 더 좋은 방법으로 해결했지만 내 응용 프로그램의 애니메이션 엔진에 싱글 톤 / 관리자를 사용하고 텍스트 필드가 응답자가 될 때마다 정적 필드에 할당 할 것입니다. 다른 특정 사건에 근거하여 휩쓸려 (사임) ... 단락에서 설명하기가 거의 불가능합니다.

창의력을 발휘하십시오.이 질문을 찾은 후 내 앱에 대해 생각하는 데 10 분 밖에 걸리지 않았습니다.


최근에 사용해야했던 약간 더 강력한 방법 :

- (void) dismissKeyboard {
    NSArray *windows = [UIApplication sharedApplication].windows;

    for(UIWindow *window in windows) [window endEditing:true];

    //  Or if you're only working with one UIWindow:

    [[UIApplication sharedApplication].keyWindow endEditing:true];
}

다른 "전역"방법 중 일부가 작동하지 않는 것을 발견했습니다 (예 : UIWebView& WKWebView사임 거부).


보기에 Tap Gesture Recognizer를 추가하고 ibaction을 정의하십시오

.m 파일은

    - (IBAction)hideKeyboardGesture:(id)sender {
    NSArray *windows = [UIApplication sharedApplication].windows;
    for(UIWindow *window in windows) [window endEditing:true];
    [[UIApplication sharedApplication].keyWindow endEditing:true];
}

그것은 나를 위해 일했다


예, endEditing이 가장 좋습니다. iOW 7.0부터는 UIScrollView스크롤보기와 상호 작용할 때 키보드를 닫는 멋진 기능이 있습니다. 이를 위해의 keyboardDismissMode속성을 설정할 수 있습니다 UIScrollView.

키보드 해제 모드를 다음과 같이 설정하십시오.

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag

다른 유형은 거의 없습니다. 사과 문서를 살펴보십시오 .


신속하게 :

self.view.endEditing(true)

쉬운 방법은 메소드를 호출하는 것입니다

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{
    if(![txtfld resignFirstResponder])
    {
        [txtfld resignFirstResponder];
    }
    else
    {

    }
    [super touchesBegan:touches withEvent:event];
}

이 방법 중 하나를 사용해야합니다.

[self.view endEditing:YES];

또는

[self.textField resignFirstResponder];

참고 URL : https://stackoverflow.com/questions/741185/easy-way-to-dismiss-keyboard



반응형