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



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
}
Question

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

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

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




빠른

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




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 와 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;
}



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

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



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

스위프트 :

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()
        }
    }
}



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

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

    }



내 해킹이 :

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

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

_userInput은 TextField 아울렛입니다.




이 시도 :

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

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



이 시도 .

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



질문은 반환 키를 사용하여이를 수행하는 방법을 묻지 만 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 () 를 호출 하십시오 .

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

건배,

무라트




이 문제를 다른 방식으로 해결했습니다.

  • 배경에 배치 할 버튼 만들기
  • Attribute Inspector에서 버튼 유형을 custom로 변경하면 버튼이 투명하게됩니다.
  • 단추를 확장하여 전체보기를 덮고 단추가 다른 모든 개체 뒤에 있는지 확인하십시오. 이렇게하는 쉬운 방법은 버튼을 뷰의 목록보기의 맨 위로 드래그하는 것입니다.
  • 제어 단추를 viewController.h 파일로 드래그하고 다음과 같이 조치를 작성하십시오 (보낸 된 이벤트 : 내부를 터치하십시오).

    (IBAction)ExitKeyboard:(id)sender;
    
  • ViewController.m 다음과 같이 보일 것입니다 :

    (IBAction)ExitKeyboard:(id)sender {
        [self.view endEditing:TRUE];
    }
    
  • 응용 프로그램을 실행하고 TextView에서 클릭하면 키보드가 사라집니다.



josebama 가이 스레드에서 사용할 수있는 가장 완전하고 깨끗한 대답이라고 대답했습니다.

다음은 Swift 3 구문입니다.

func textView(_ textView: UITextView, shouldChangeTextIn _: NSRange, replacementText text: String) -> Bool {
    let resultRange = text.rangeOfCharacter(from: CharacterSet.newlines, options: .backwards)
    if text.characters.count == 1 && resultRange != nil {
        textView.resignFirstResponder()
        // Do any additional stuff here
        return false
    }
    return true
}



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

이것은 신뢰할 수 있고 사용하기 쉬운 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");
}

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






Links