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 센트가 있습니다.
나는 대답을 찾았다. samvermette 및 ribeto 정말 유용하고, 또한 의해 코멘트 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"])
하지 않으면 편집 할 수 없습니다