[iphone] 리턴 키로 UITextView의 키보드를 해제하는 방법은 무엇입니까?

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

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

그러나 return키보드에 키에 대한 작업을 추가하여 추가 할 필요가없는 방법이 UIButton있습니까?



답변

UITextView사용자가 리턴 키를 눌렀을 때 호출되는 메소드가 없습니다. 사용자가 한 줄의 텍스트 만 추가 할 수있게하려면을 사용하십시오 UITextField. 리턴을 치고 키보드를 숨기는 UITextView것은 인터페이스 지침을 따르지 않습니다.

그럼에도 불구 하고이 작업을 수행하려는 경우 대체 텍스트가 있는지 확인하고 해당 확인 textView:shouldChangeTextInRange:replacementText:방법을 구현하십시오.UITextViewDelegate\n 인 하고 키보드를 숨기십시오.

다른 방법이있을 수 있지만 나는 전혀 모른다.


답변

대신 스 니펫을 여기에 게시 할 것이라고 생각했습니다.

UITextViewDelegate프로토콜에 대한 지원을 선언해야합니다 .

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

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

    return YES;
}

스위프트 4.0 업데이트 :

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


답변

나는 이것이 이미 대답되었다는 것을 알고 있지만 실제로 줄 바꿈에 문자열 리터럴을 사용하는 것을 좋아하지 않으므로 여기에 내가 한 일이 있습니다.

- (BOOL)textView:(UITextView *)txtView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    if( [text rangeOfCharacterFromSet:[NSCharacterSet newlineCharacterSet]].location == NSNotFound ) {
        return YES;
    }

    [txtView resignFirstResponder];
    return NO;
}

스위프트 4.0 업데이트 :

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
if (text as NSString).rangeOfCharacter(from: CharacterSet.newlines).location == NSNotFound {
    return true
}
txtView.resignFirstResponder()
return false
}


답변

나는 이것이 여러 번 대답되었다는 것을 알고 있지만 여기 에이 문제에 대한 2 센트가 있습니다.

나는 대답을 찾았다. samvermetteribeto 정말 유용하고, 또한 의해 코멘트 maxpower 에서 ribeto 의 대답을. 그러나 이러한 접근 방식에는 문제가 있습니다. samvermette 에서 매트가 언급 한 문제 의 대답 는 사용자가 줄 바꿈으로 무언가를 붙여 넣으려면 키보드를 붙여 넣지 않고 숨길 수 있다는 것입니다.

그래서 내 접근 방식은 위에서 언급 한 세 가지 솔루션의 혼합이며 문자열 길이가 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;
}


답변

보다 우아한 방법은 사용자가 키보드 프레임 바깥 쪽을 누를 때 키보드를 닫는 것입니다.

먼저 UIBuilder의 자격 증명 관리자에서 ViewController의보기를 “UIControl”클래스로 설정하십시오. 보기를 ViewController의 헤더 파일로 Control- 드래그하고 Touch Up Inside와 같은 이벤트와 같은 동작으로 연결하십시오.

ViewController.h

-(IBAction)dismissKeyboardOnTap:(id)sender;

기본 ViewController 파일에서 ViewController.m :

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

유사한 기술을 사용하여 두 번 누르거나 길게 터치해야 할 수 있습니다. ViewController를 UITextViewDelegate로 설정하고 TextView를 ViewController에 연결해야 할 수도 있습니다. 이 메서드는 UITextView와 UITextField 모두에 적용됩니다.

출처 : 빅 얼간이 목장

편집 : 또한 UIScrollView를 사용하는 경우 위의 기술이 Interface Builder를 통해 쉽게 작동하지 않을 수 있다고 덧붙이고 싶습니다. 이 경우 UIGestureRecognizer를 사용하고 대신 [[self view] endEditing : YES] 메소드를 호출 할 수 있습니다. 예를 들면 다음과 같습니다.

-(void)ViewDidLoad{
    ....
    UITapGestureRecognizer *tapRec = [[UITapGestureRecognizer alloc]
        initWithTarget:self action:@selector(tap:)];
    [self.view addGestureRecognizer: tapRec];
    ....
}

-(void)tap:(UITapGestureRecognizer *)tapRec{
    [[self view] endEditing: 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()
        }
    }
}


답변

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

yourtextView.delegate=self;

또한 추가 UITextViewDelegate

프로토콜을 확인하는 것을 잊지 마십시오

추가 if([text isEqualToString:@"\n"])하지 않으면 편집 할 수 없습니다