iphone 리턴 키를 사용하여 UITextView의 키보드를 닫는 방법?





15 Answers

여기에서 대신 스 니펫을 게시하겠다고 생각했습니다.

UITextViewDelegate 프로토콜에 대한 지원을 선언했는지 확인하십시오.

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {

    if([text isEqualToString:@"\n"]) {
        [textView resignFirstResponder];
        return NO;
    }

    return YES;
}

Swift 4.0 업데이트 :

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    if text == "\n" {
        textView.resignFirstResponder()
        return false
    }
    return true
}
iphone objective-c keyboard uitextview iphone-softkeyboard

IB의 라이브러리에서 소개문은 리턴 키를 누르면 UITextView 용 키보드가 사라진다는 것을 알려줍니다. 그러나 실제로 리턴 키는 '\ n'으로 만 작동 할 수 있습니다.

버튼을 추가하고 [txtView resignFirstResponder] 를 사용하여 키보드를 숨길 수 있습니다.

하지만 UIButton 추가 할 필요가 없도록 키보드의 반환 키에 동작을 추가하는 방법이 있습니까?




나는 이것이 여러 번 대답되어 졌음을 알고 있지만, 여기에 나의 두 가지 센트가있다.

나는 samvermette 와 ribeto 의 답변이 정말 유용하다는 것을 발견 samvermette , ribeto 의 답변에서 samvermette 의 의견도 maxpower 했습니다. 그러나 이러한 접근 방식에 문제가 있습니다. samvermette 의 대답에 matt 언급 한 문제는 사용자가 줄 바꿈을 사용하여 붙여 넣기를 원할 경우 키보드를 붙여 넣지 않고 숨길 수 있다는 것입니다.

따라서 위의 세 가지 솔루션이 혼합되어 있으며 문자열 길이가 1 일 때 입력 한 문자열이 새로운 줄인지 확인하기 때문에 사용자가 붙여 넣기 대신 입력하는지 확인해야합니다.

여기 내가 한 일이있다.

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    NSRange resultRange = [text rangeOfCharacterFromSet:[NSCharacterSet newlineCharacterSet] options:NSBackwardsSearch];
    if ([text length] == 1 && resultRange.location != NSNotFound) {
        [textView resignFirstResponder];
        return NO;
    }

    return YES;
}



이 메서드를 뷰 컨트롤러에 추가하십시오.

스위프트 :

func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {
    if text == "\n" {
        textView.resignFirstResponder()
        return false
    }
    return true
}

이 방법은 또한 도움이 될 수 있습니다.

/**
Dismiss keyboard when tapped outside the keyboard or textView

:param: touches the touches
:param: event   the related event
*/
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    if let touch = touches.anyObject() as? UITouch {
        if touch.phase == UITouchPhase.Began {
            textField?.resignFirstResponder()
        }
    }
}



uitextview를 사용하는 동안 또 다른 솔루션이 있습니다. "textViewShouldBeginEditing"에서 InputAccessoryView로 도구 모음을 추가 할 수 있으며이 툴바의 완료 버튼에서 키보드를 닫을 수 있습니다.이 코드는 다음과 같습니다.

viewDidLoad에서

toolBar = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, 320, 44)]; //toolbar is uitoolbar object
toolBar.barStyle = UIBarStyleBlackOpaque;
UIBarButtonItem *btnDone = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(btnClickedDone:)];
[toolBar setItems:[NSArray arrayWithObject:btnDone]];

textviewdelegate 메소드에서

- (BOOL)textViewShouldBeginEditing:(UITextView *)textView
{
     [textView setInputAccessoryView:toolBar];
     return YES;
}

툴바에있는 버튼 완료 동작은 다음과 같습니다.

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



samvermette에 대한 단호한 의견처럼, 나는 "\ n"중 하나를 감지하는 아이디어를 좋아하지 않는다. UITextView에는 "return"키가 있습니다. 즉, 다음 행으로 이동하는 것입니다.

내 의견으로는 키보드에 도구 모음 (및 단추)을 추가하는 것입니다.

나는 다음 블로그 포스트에서 코드를 얻었다.

http://www.iosdevnotes.com/2011/02/iphone-keyboard-toolbar/

단계 :

- XIB 파일에 툴바 추가 - 높이를 460으로 설정

도구 모음 단추 항목을 추가하십시오 (아직 추가하지 않은 경우). 오른쪽 정렬해야하는 경우 XIB에 유연한 막대 단추 항목을 추가하고 도구 모음 단추 항목을 이동합니다

다음과 같이 resignFirstResponder에 버튼 항목을 연결하는 작업을 만듭니다.

- (IBAction)hideKeyboard:(id)sender {
    [yourUITextView resignFirstResponder];
}

-그때:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];

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

- (void)keyboardWillShow:(NSNotification *)notification {
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3];

    CGRect frame = self.keyboardToolbar.frame;
    frame.origin.y = self.view.frame.size.height - 260.0;
    self.keyboardToolbar.frame = frame;

    [UIView commitAnimations];
}

- (void)keyboardWillHide:(NSNotification *)notification {
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3];

    CGRect frame = self.keyboardToolbar.frame;
    frame.origin.y = self.view.frame.size.height;
    self.keyboardToolbar.frame = frame;

    [UIView commitAnimations];
}



viewDidLoad에 옵저버 추가

[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(textViewKeyPressed:) name: UITextViewTextDidChangeNotification object: nil];

선택기를 사용하여 "\ n"

-(void) textViewKeyPressed: (NSNotification*) notification {

  if ([[[notification object] text] hasSuffix:@"\n"])
  {
    [[notification object] resignFirstResponder];
  }
}

그것은 "\ n"을 사용하고 특히 반환 키를 확인하지는 않지만 이것이 괜찮다고 생각합니다.

최신 정보

아래의 \n 을 대신하여 [NSCharacterSet newlineCharacterSet] 을 사용하는 답변을 참조하십시오.




이 시도 :

 - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{
    if ([text isEqualToString:@"\n"]) {
        [self.view endEditing:YES];
    }

    return YES;

}



빠른

func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {
    if text == "\n" {
        textView.resignFirstResponder()
    }
    return true
}




보기 화면에서 터치 할 때 키보드를 숨길 수도 있습니다.

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
     UITouch * touch = [touches anyObject];
     if(touch.phase == UITouchPhaseBegan) {
        [txtDetail resignFirstResponder];
      }
 }



이 코드를 사용하여 응답자를 변경했습니다.

 - (BOOL)textView:(UITextView*) textView shouldChangeTextInRange: (NSRange) range replacementText: (NSString*) text
    {
        if ([text isEqualToString:@"\n"]) {
            //[textView resignFirstResponder];
            //return YES;
            NSInteger nextTag = textView.tag + 1;
            // Try to find next responder
            UIResponder* nextResponder = [self.view viewWithTag:nextTag];
            if (nextResponder) {
                // Found next responder, so set it.
                [nextResponder becomeFirstResponder];
            } else {
                // Not found, so remove keyboard.
                [textView resignFirstResponder];
            }
            return NO; 


            return NO;
        }
        return YES;

    }



- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range  replacementText:(NSString *)text
{
    if (range.length==0) {
        if ([text isEqualToString:@"\n"]) {
            [txtView resignFirstResponder];
            if(textView.returnKeyType== UIReturnKeyGo){

                [self PreviewLatter];
                return NO;
            }
            return NO;
        }
    }   return YES;
}



질문은 반환 키를 사용하여이를 수행하는 방법을 묻지 만 UITextView를 사용할 때 이것이 키보드를 사라지게하려는 의도를 가진 사람을 도울 수 있다고 생각합니다.

@IBOutlet weak var textView: UITextView!

private func addToolBarForTextView() {
  let textViewToolbar: UIToolbar = UIToolbar()
  textViewToolbar = UIBarStyle.Default
  textViewToolbar = [
    UIBarButtonItem(title: "Cancel", style: UIBarButtonItemStyle.Done, target: self, action: #selector(self.cancelInput)),
    UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: self, action: nil),
    UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Done, target: self, action: #selector(self.doneInput))
  ]
  textViewToolbar()
  self.textView.inputAccessoryView = textViewToolbar //do it for every relevant textView if there are more than one
}

func doneInput() {
  self.textView.resignFirstResponder()
}

func cancelInput() {
  self.textView.text = ""
  self.textView.resignFirstResponder()
}

viewDidLoad 또는 다른 라이프 사이클 메소드에서 addToolBarForTextView () 를 호출 하십시오 .

그것이 나를위한 완벽한 해결책 인 것 같습니다.

건배,

무라트




나는 그것이이 질문에 대한 정확한 답이 아니라는 것을 안다. 그러나 나는 대답을 위해 인터넷을 사냥 한 후에이 실을 발견했다. 나는 다른 사람들이 그 느낌을 공유한다고 생각한다.

이것은 신뢰할 수 있고 사용하기 쉬운 UITapGestureRecognizer의 차이입니다. 단지 TextContent의 델리게이트를 ViewController에 설정하십시오.

ViewDidLoad 대신 TextView가 편집을 위해 활성 상태가되면 UITapGestureRecognizer를 추가합니다.

-(void)textViewDidBeginEditing:(UITextView *)textView{
    _tapRec = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tap:)];

    [self.view addGestureRecognizer: _tapRec];
    NSLog(@"TextView Did begin");
}

TextView 바깥을 탭하면 편집 모드가 끝나고 UITapGestureRecognizer가 제거되므로 뷰의 다른 컨트롤과 계속 상호 작용할 수 있습니다.

-(void)tap:(UITapGestureRecognizer *)tapRec{
    [[self view] endEditing: YES];
    [self.view removeGestureRecognizer:tapRec];
    NSLog(@"Tap recognized, tapRec getting removed");
}

이게 도움이 되길 바란다. 너무 명백한 것 같지만 웹상 어디에서나이 솔루션을 본 적이 없습니다. 제가 잘못하고 있습니까?




이 시도 .

NSInteger lengthOfText = [[textView.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] length];



내 해킹이 :

1- 전체보기를 덮는 단추를 작성하십시오. 2-보기의 배경으로 보내십시오. 3 변경하십시오. 속성 검사기에서 "Round Rect"에서 "Custom"으로 유형을 지정하십시오. 4- 작업을 작성하십시오. 5 조치 메소드를 구현하십시오.

- (IBAction)bgTouched:(id)sender 
{
    //to dismiss keyboard on bg btn pressed
    [_userInput resignFirstResponder];
}

_userInput은 TextField 아울렛입니다.




Related