programing

iOS - UITextField 외부에서 터치할 때 키보드 해제

closeapi 2023. 6. 15. 21:52
반응형

iOS - UITextField 외부에서 터치할 때 키보드 해제

사용자가 외부를 터치할 때 키보드가 사라지도록 하는 방법이 궁금합니다.UITextField.

UITapGestureRecogniser한 다음, 합니다.UITextField선택기에 있습니다.

코드:

뷰에서 DidLoad

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];

[self.view addGestureRecognizer:tap];

키보드 해제 시:

-(void)dismissKeyboard 
{
    [aTextField resignFirstResponder];
}

서)aTextField키보드를 담당하는 텍스트 필드입니다.

스위프트 3 버전은 그렇게 보입니다.

let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard (_:)))
self.view.addGestureRecognizer(tapGesture)

키보드 해제용

@objc func dismissKeyboard (_ sender: UITapGestureRecognizer) {
    aTextField.resignFirstResponder()
}

나는 몇 가지 대답을 해냈습니다.

할 때 초기화되는 합니다.viewDidLoad:

UIGestureRecognizer *tapper;

- (void)viewDidLoad
{
    [super viewDidLoad];
    tapper = [[UITapGestureRecognizer alloc]
                initWithTarget:self action:@selector(handleSingleTap:)];
    tapper.cancelsTouchesInView = NO;
    [self.view addGestureRecognizer:tapper];
}

현재 편집 중인 항목을 모두 삭제합니다.

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

이걸 확인해 보세요, 이렇게 하는 게 가장 쉬운 방법일 겁니다.

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
      [self.view endEditing:YES];// this will do the trick
}

또는

이 라이브러리는 스크롤 막대 자동 스크롤, 키보드 숨기기 공간 탭 등을 처리합니다.

https://github.com/michaeltyson/TPKeyboardAvoiding

일부 사람들이 사용하는 데 문제가 있다는 것을 알 수 있습니다.UITapGestureRecognizerㅠㅠ. 은 @입니다.기존 버튼의 탭 동작을 그대로 유지하면서 이 기능을 수행한 가장 쉬운 방법은 @Jensen2k의 대답에 한 줄만 추가하는 것입니다.

[tap setCancelsTouchesInView:NO];

이를 통해 @Dmitry Sitnikov의 방법을 사용하지 않고도 기존 버튼이 여전히 작동할 수 있었습니다.

그것에 대해 읽어보세요.property(여검기(색검))를 검색합니다.CancelsTouchesInView): UIGesture 인식기 클래스 참조

스크롤 막대에서 어떤 방식으로 작동할지 잘 모르겠습니다. 일부 문제가 있었지만 다른 사람이 저와 같은 시나리오에 부딪혔으면 합니다.

당신의 것을 만드는 것이 더 좋습니다.UIViewUIControl in in in in in in in in in in in in in in in in in interface builder합니다.TouchUpInside에게의 사건.dismissKeyboard방법.이것.IBAction방법은 다음과 같습니다.

- (IBAction)dismissKeyboard:(id)sender {
    [aTextBox resignFirstResponder];
}

스위프트 4

를 합니다.UIViewController이 확장 방법으로 예를 들어 한 번viewDidLoad:

override func viewDidLoad() {
    super.viewDidLoad()
    self.setupHideKeyboardOnTap()
}

그리고 키보드는 탭을 눌러도 제거됩니다.NavigationBar.

import UIKit
extension UIViewController {
    /// Call this once to dismiss open keyboards by tapping anywhere in the view controller
    func setupHideKeyboardOnTap() {
        self.view.addGestureRecognizer(self.endEditingRecognizer())
        self.navigationController?.navigationBar.addGestureRecognizer(self.endEditingRecognizer())
    }

    /// Dismisses the keyboard from self.view
    private func endEditingRecognizer() -> UIGestureRecognizer {
        let tap = UITapGestureRecognizer(target: self.view, action: #selector(self.view.endEditing(_:)))
        tap.cancelsTouchesInView = false
        return tap
    }
}

빠른 버전, 이것은 다른 요소들과 함께 작동합니다 (예:UIButton 다른 이저러쿵러.UITextField):

override func viewDidLoad() {
    super.viewDidLoad()

    let tapper = UITapGestureRecognizer(target: self, action:#selector(endEditing))
    tapper.cancelsTouchesInView = false
    view.addGestureRecognizer(tapper)
}

이것은 좋은 일반적인 솔루션입니다.

목표-C:

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

스위프트:

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    self.view.endEditing(true)
}

@icodebuster 솔루션 기반: https://stackoverflow.com/a/18756253/417652

이거 어때:저는 이것이 오래된 게시물이라는 것을 압니다.누군가에게 도움이 될 수도 있습니다 :)

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {  
    NSArray *subviews = [self.view subviews];
    for (id objects in subviews) {
        if ([objects isKindOfClass:[UITextField class]]) {
            UITextField *theTextField = objects;
            if ([objects isFirstResponder]) {
                [theTextField resignFirstResponder];
            }
        } 
    }
}

스위프트 4 원라이너

view.addGestureRecognizer(UITapGestureRecognizer(target: view, action: #selector(UIView.endEditing(_:))))

이를 위한 가장 쉬운(그리고 가장 좋은) 방법은 글로벌 뷰를 세분화하고 사용하는 것이라고 생각합니다.hitTest:withEvent모든 터치를 들을 수 있는 방법.키보드 터치가 등록되지 않았으므로 Test:withEvent를 누르면 터치/스크롤/스위프/핀치를 할 때만 호출됩니다...다른 곳에서, 그리고 나서 전화하세요.[self endEditing:YES].

이것은 사용하는 것보다 더 좋습니다.touchesBegantouchesBegan보기 맨 위에 있는 단추를 클릭하면 호출되지 않습니다.은 그은보보다 더 .UITapGestureRecognizer예를 들어 스크롤하는 제스처를 인식할 수 없습니다.또한 복잡하고 동적인 사용자 인터페이스에서는 모든 곳에 어두운 화면을 배치할 수 없기 때문에 어두운 화면을 사용하는 것보다 더 좋습니다. 두 번 누를 필요가 예: 또한다작차예않외버두없필부튼습요니가다누번를서을에으며른업지단을하예▁outside▁moreover없(:▁(▁in습니다▁button필like▁twice▁a,요▁of▁case▁a▁it▁the:UIPopover).

또한, 전화하는 것보다 낫습니다.[textField resignFirstResponder]화면에 많은 텍스트 필드가 있을 수 있으므로 모든 필드에 적용됩니다.

외부를 터치하여 키보드를 숨기는 가장 쉬운 방법은 다음과 같습니다.

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

(사용자가 텍스트 필드 외부의 다른 영역을 누를키보드를 해제하는 방법?)

UIScrollView그런 다음 다음을 사용할 수 있습니다.

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;

전자는 테이블 보기가 스크롤될 때 키보드를 화면 밖으로 애니메이션화하고 후자는 재고 메시지 앱처럼 키보드를 숨깁니다.

iOS 7.0 이상에서 사용할 수 있습니다.

XCode 6 이상의 스토리보드를 사용하여 이 작업을 수행할 수 있습니다.


키보드 숨기기 작업 만들기

ViewController에서 사용하는 클래스의 헤더 파일에 추가합니다.

@interface TimeDelayViewController : UIViewController <UITextFieldDelegate>

- (IBAction)dissmissKeyboardOnTap:(id)sender;

@end

그런 다음 동일한 ViewController의 구현 파일에 추가합니다.

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

이제 스토리보드 장면(예: ViewController)에 대한 '수신된 액션' 중 하나가 됩니다.

enter image description here


작업을 사용자 이벤트에 연결

이제 키보드를 터치하는 사용자 제스처에 이 동작을 연결해야 합니다.

중요 - 스토리보드에 포함된 'UIView'를 UIC 컨트롤로 변환해야 이벤트를 수신할 수 있습니다.View Controller Scene 계층에서 보기를 선택합니다.

enter image description here

...클래스를 변경합니다.

enter image description here

이제 장면의 '수신된 액션' 옆에 있는 작은 원에서 장면의 '빈' 부분으로 끕니다(실제로는 '수신된 액션'을 UI 컨트롤로 끕니다).다음과 같은 작업을 수행할 수 있는 이벤트를 선택할 수 있습니다.

enter image description here

'내부 터치업' 옵션을 선택합니다.이제 만든 IBAction을 키보드를 터치하는 사용자 작업에 연결했습니다.사용자가 키보드를 누르면 키보드가 숨겨집니다.

(참고: 이벤트에 작업을 연결하려면 수신된 작업에서 View 컨트롤러 계층의 UI 컨트롤로 직접 끌어서 이동할 수도 있습니다.계층에서 'Control'로 표시됩니다.)

내가 제대로 이해했다면 외부를 탭하는 동안 키보드를 사임하고 싶을 것입니다.textfield하지만 당신은 당신에 대한 언급이 없습니다.textfield.

사용해 보십시오.

  • 글로벌 textField를 사용하여 이를 호출합니다.reftextField
  • 지금은textFieldDidBeginEditing참조 텍스트 필드를 다음으로 설정

    - (void) textFieldDidBeginEditing:(UITextField *)textField{
        reftextField = textField;
    }
    
  • 이제 모든 버튼 시계에서 행복하게 사용할 수 있습니다(편집 시작 시 투명 버튼 추가 권장).

    - (void)dismissKeyboard {
          [reftextField resignFirstResponder];
    }
    
  • 아니면 사임 버튼을 누르거나 이것을 클릭하세요.

    //for resigning on done button    
    - (BOOL) textFieldShouldReturn:(UITextField *)textField{
        [textField resignFirstResponder];
        return YES;
    }
    

여기 목록에 외부 터치에서 키보드를 해제하는 방법에 대한 제 버전을 추가하려고 합니다.

ViewDidLoad:

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
[self.view addGestureRecognizer:singleTap];

어디서나:

-(void)handleSingleTap:(UITapGestureRecognizer *)sender{
    [textFieldName resignFirstResponder];
    puts("Dismissed the keyboard");
}

Inswift 5 다음 코드를 사용하여 텍스트 필드 외부의 키보드를 해제할 수 있습니다.

override func viewDidLoad() {
    // ... code

    let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard(_:)))
    self.view.addGestureRecognizer(tapGesture)  
}

@objc func dismissKeyboard(_ sender: UITapGestureRecognizer) {
    self.view.endEditing(true)
}

목표-C:

코드를 ViewController.m 파일에 추가합니다.

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

스위프트:

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

사용에 대한 많은 훌륭한 답변이 여기에 있습니다.UITapGestureRecognizer 것이 중단됩니다. -----------------------------------------------------------UITextField의 지우기(X) 버튼.해결책은 대리자를 통해 제스처 인식기를 억제하는 것입니다.

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    BOOL touchViewIsButton = [touch.view isKindOfClass:[UIButton class]];
    BOOL touchSuperviewIsTextField = [[touch.view superview] isKindOfClass:[UITextField class]];
    return !(touchViewIsButton && touchSuperviewIsTextField);
}

가장 강력한 솔루션은 아니지만 저에게는 효과가 있습니다.

다음과 같이 UiView에 대한 카테고리를 생성하고 touchsBegin 메서드를 재정의할 수 있습니다.

그것은 저에게 잘 작동하고 있습니다.그리고 이 문제에 대한 중앙 집중식 해결책입니다.

#import "UIView+Keyboard.h"
@implementation UIView(Keyboard)

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

@Jensen2k의 답변의 빠른 버전:

let gestureRecognizer : UITapGestureRecognizer = UITapGestureRecognizer.init(target: self, action: "dismissKeyboard")
self.view.addGestureRecognizer(gestureRecognizer)

func dismissKeyboard() {
    aTextField.resignFirstResponder()
}

원 라이너

self.view.addTapGesture(UITapGestureRecognizer.init(target: self, action: "endEditing:"))

저는 새로운 개발을 위해 배리의 예를 사용했습니다.잘 작동했습니다! 하지만 편집 중인 텍스트 필드에 대해서만 키보드를 해제해야 하는 약간의 변경 사항을 포함해야 했습니다.

그래서 배리의 예에 다음을 추가했습니다.

- (void) textFieldDidBeginEditing:(UITextField *)textField
{
    _textBeingEdited = textField;
}
-(void) textFieldDidEndEditing:(UITextField *)textField
{
    _textBeingEdited = nil;
}

또한 다음과 같이 키보드 숨기기 방법을 변경했습니다.

- (IBAction)hideKeyboard:(id)sender
{
    // Just call resignFirstResponder on all UITextFields and UITextViews in this VC
    // Why? Because it works and checking which one was last active gets messy.
    //UITextField * tf = (UITextField *) sender;
    [_textBeingEdited resignFirstResponder];
}

중 는 이 를 가장쉽짧방법중하이당코컴다신것추입니는가하퓨에에 하는 입니다.viewDidLoad

[self.view addGestureRecognizer:[[UITapGestureRecognizer alloc]
                                     initWithTarget:self.view
                                     action:@selector(endEditing:)]];
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {

    if let touch = touches.first{
     view.endEditing(true)

     }
}

저는 여기서 많은 반응을 시도했지만 운이 없었습니다.탭 제스처 인식기가 항상 문제를 일으켰습니다.UIButtons탭해도 제가 해도 반응이걸리지 않습니다. 심지어 제가 설정했을 때도.cancelsTouchesInView제스처 인식기의 속성을 NO로 지정합니다.

이것이 결국 문제를 해결한 것입니다.

아이바 있음:

UITapGestureRecognizer *_keyboardDismissGestureRecognizer;

텍스트 필드가 편집을 시작하면 제스처 인식기를 설정합니다.

- (void) textFieldDidBeginEditing:(UITextField *)textField
{
    if(_keyboardDismissGestureRecognizer == nil)
    {
        _keyboardDismissGestureRecognizer = [[[UITapGestureRecognizer alloc]
                                       initWithTarget:self
                                       action:@selector(dismissKeyboard)] autorelease];
        _keyboardDismissGestureRecognizer.cancelsTouchesInView = NO;

        [self.view addGestureRecognizer:_keyboardDismissGestureRecognizer];
    }
}

그렇다면 중요한 것은 어떻게 설정하느냐에 있습니다.dismissKeyboard방법:

- (void) dismissKeyboard
{
    [self performSelector:@selector(dismissKeyboardSelector) withObject:nil afterDelay:0.01];
}

- (void) dismissKeyboardSelector
{
    [self.view endEditing:YES];

    [self.view removeGestureRecognizer:_keyboardDismissGestureRecognizer];
    _keyboardDismissGestureRecognizer = nil;
}

내 생각에 그것을 얻는 것에는 뭔가가 있는 것 같아요.dismissKeyboardSelector터치 핸들링 실행 스택에서 실행...

resignFirstResponder텍스트 파일에 저장할 수 있습니다.자세한 내용은 이 게시물을 참조하십시오.

작동합니다.

이 예에서 TextField는 유일한 UITextField...다른 또는 UITextView가 있는 경우에는 조금 더 해야 할 일이 있습니다.

// YourViewController.h
// ...
@interface YourViewController : UIViewController /* some subclass of UIViewController */ <UITextFieldDelegate> // <-- add this protocol
// ...
@end

// YourViewController.m

@interface YourViewController ()
@property (nonatomic, strong, readonly) UITapGestureRecognizer *singleTapRecognizer;
@end
// ...

@implementation
@synthesize singleTapRecognizer = _singleTapRecognizer;
// ...

- (void)viewDidLoad
{
    [super viewDidLoad];
    // your other init code here
    [self.view addGestureRecognizer:self.singleTapRecognizer];

{

- (UITapGestureRecognizer *)singleTapRecognizer
{
    if (nil == _singleTapRecognizer) {
        _singleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapToDismissKeyboard:)];
        _singleTapRecognizer.cancelsTouchesInView = NO; // absolutely required, otherwise "tap" eats events.
    }
    return _singleTapRecognizer;
}

// Something inside this VC's view was tapped (except the navbar/toolbar)
- (void)singleTapToDismissKeyboard:(UITapGestureRecognizer *)sender
{
    NSLog(@"singleTap");
    [self hideKeyboard:sender];
}

// When the "Return" key is pressed on the on-screen keyboard, hide the keyboard.
// for protocol UITextFieldDelegate
- (BOOL)textFieldShouldReturn:(UITextField*)textField
{
    NSLog(@"Return pressed");
    [self hideKeyboard:textField];
    return YES;
}

- (IBAction)hideKeyboard:(id)sender
{
    // Just call resignFirstResponder on all UITextFields and UITextViews in this VC
    // Why? Because it works and checking which one was last active gets messy.
    [aTextField resignFirstResponder];
    NSLog(@"keyboard hidden");
}
- (void)viewDidLoad
{
    [super viewDidLoad]; 

UITapGestureRecognizer *singleTapGestureRecognizer = [[UITapGestureRecognizer alloc]
                                                          initWithTarget:self
                                                          action:@selector(handleSingleTap:)];
    [singleTapGestureRecognizer setNumberOfTapsRequired:1];
    [singleTapGestureRecognizer requireGestureRecognizerToFail:singleTapGestureRecognizer];

    [self.view addGestureRecognizer:singleTapGestureRecognizer];
}

- (void)handleSingleTap:(UITapGestureRecognizer *)recognizer
{
    [self.view endEditing:YES];
    [textField resignFirstResponder];
    [scrollView setContentOffset:CGPointMake(0, -40) animated:YES];

}

이 경우 ScrollView를 사용하여 다음에 추가할 수 있습니다.TextField에서 I the ScrollView(스크롤뷰)를.ScrollView보기를 선택한 다음 키보드를 해제합니다.만약을 위해 샘플 코드를 만들어 보았습니다. 것처럼.

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var scrollView: UIScrollView!
    @IBOutlet weak var textField: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()

        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(ViewController.tap(_:)))
        view.addGestureRecognizer(tapGesture)
        // Do any additional setup after loading the view, typically from a nib.
    }
    func tap(gesture: UITapGestureRecognizer) {
        textField.resignFirstResponder()
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

당신의 스토리보드 저것을 보세요.

enter image description here

UITextField 외부를 클릭하여 키보드를 해제하는 데 UITapGestureReconnizer 방법을 사용할 수 있습니다.사용자가 UITextField 외부를 클릭할 때마다 이 방법을 사용하면 키보드가 해제됩니다.아래는 이를 사용하기 위한 코드 조각입니다.

 UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]
                                   initWithTarget:self
                                   action:@selector(dismissk)];

    [self.view addGestureRecognizer:tap];


//Method
- (void) dismissk
{
    [abctextfield resignFirstResponder];
    [deftextfield resignFirstResponder];

}

언급URL : https://stackoverflow.com/questions/5306240/ios-dismiss-keyboard-when-touching-outside-of-uitextfield

반응형