2011-01-06 3 views
25

iPhone의 내장 메시지 응용 프로그램과 매우 흡사하게 응용 프로그램에서 채팅을 구현하고 있습니다. 버튼 옆에 UITextField가 있습니다. 사용자는 텍스트 필드에 무언가를 입력하고 텍스트 필드는 다양한 자동 수정을 제안합니다. 내장 된 메시지 앱에서 보내기 버튼을 누르면 현재 표시되는 자동 수정 제안이 실행됩니다. 내 응용 프로그램에서이 동작을 찾고 있지만 아무것도 찾을 수 없었습니다.다른 버튼을 눌렀을 때 현재 UITextField 자동 제안을 실행하십시오.

완전히 별도의 컨트롤이 활성화되었을 때 현재 보이는 autocorrection/autocomplete 제안을 UITextField에서 프로그래밍 방식으로 실행하는 방법을 아는 사람이 있습니까? 어떻게 든 가능합니다.

답변

37

필드에 -resignFirstResponder (으)로 전화하십시오. 그것은 그것이 자동 고침을 받아 들일 것을 강요합니다. 키보드를 닫지 않으려면 -becomeFirstResponder으로 다시 전화하십시오.

+0

우수하겠습니다. –

+2

'-becomeFirstResponder'를 다시 호출하려면 실제로 초점이 맞는지 확인하십시오. 이것을 테스트하려면'editing' 속성을 사용하십시오 ('isFirstResponder'가 UITextFields에서 작동하지 않는 것을 확인하십시오). –

+0

감사합니다. 완벽하게 작동했습니다. 귀하의 추가 의견은 또한 매우 도움이되었다! –

10

esilver의 경우 : 다른 텍스트 필드를 firstFirstResponder로 설정하고 관련 텍스트 필드를 firstFirstResponder로 지정하여 첫 번째 응답자를 사퇴하지 않고도이 작업을 수행 할 수 있습니다. 키보드는이 경우 이동하지 않으며 숨김 알림을 트리거하지 않습니다. 다른 텍스트 필드가없는 경우 더미 텍스트 필드를 만들고 hidden = YES로 설정하십시오.

-(void)tappedSendButton:(id)sender 
{ 
    // This hack is in place to force auto-corrections to be applied 
    // before the text is sent. 
    [self.dummyTextField becomeFirstResponder]; 
    [self.toolbar.textView becomeFirstResponder]; 

    [self sendChatWithBody: [self.toolbar.textView.text copy]]; 
} 
+1

대리자 키보드를 무시하는 BOOL이 메시지를 표시하지만 여전히 보이는 애니메이션으로 테이블 뷰의 인덱스에 문제가 발생했습니다. 고맙습니다. – Conor

+0

는 매력처럼 일했습니다. 감사! –

+4

더미 텍스트 필드 전략을 시도하는 사용자에게는 동일한 부모 superview가 있는지 확인하십시오. 그렇지 않으면 becomefirstResponder가 무시됩니다! –

0

건물 닉 잠금의 제안에, 우리가 키보드를 제거하지 않고 보류중인 자동 고침 제안을 처리하기 위해 쓴 분류 방법이다 (그리고 뜻을 유발하지 않고/숨기기/표시 알림을했다).

@implementation UITextView (SuggestionHelpers) 

- (void)acceptSuggestionWithoutDismissingKeyboard { 
    // by making another UITextField the first responder, the keyboard won't try to hide 
    UITextField *temp = [[[self class] alloc] initWithFrame:CGRectZero]; 
    temp.hidden = YES; 
    [[self superview] addSubview:temp]; 
    [temp becomeFirstResponder]; 
    [self becomeFirstResponder]; 
    [temp removeFromSuperview]; 
} 

@end 
0

여기에서 논의 된 솔루션의 빠른 청소 정리해은 ...

는 응답을 한 후 원래의 텍스트 뷰에 반환하는 더미 텍스트 뷰를 작성합니다. 첫 번째 응답자인지 확인하십시오.

설정 :

self.textView = [[UITextView alloc] initWithFrame:self.view]; 
[self.view addSubview:self.textView]; 

self.dummyTextView = [[UITextView alloc] init]; 
[self.dummyTextView setHidden:YES]; 
[self.view addSubview:self.dummyTextView]; 

방법 : 사임 이후

- (void)commitSuggestions { 
    if([self.textView isFirstResponder]) { 
     [self.dummyTextView becomeFirstResponder]; 
     [self.textView becomeFirstResponder]; 
    } 
} 
5

다시 가정 부작용이있을 수 있습니다 첫 번째로 반응을 (통지 많은, 키보드 표시/숨기기 트리거 등), 나는 덜 잔인한 대안을 찾고 있었다.

+0

나를 위해 작동하지 않았다 – Alston

+0

나를 위해 일했습니다. iOS 9.2.1. 감사 맥스. – jnoor

3

이 코드는 내 경우에는 문제를 해결했다)이 도움이

[textView.inputDelegate selectionWillChange: textView]; 
[textView.inputDelegate selectionDidChange: textView]; 

희망 : 꽤 검색 후, 나는 이것이 당신이 UITextView (또는 UITextField FWIW)에 자동 수정을 적용 할 필요하다 발견 .

[self.textView rejectAutoCorrect]; 

카테고리 코드.

@implementation UITextView (rejectAutoCorrect) 

- (void)rejectAutoCorrect 
{ 
    if ([self isFirstResponder]) 
    { 
     [self.inputDelegate selectionWillChange:self]; 
     [self.inputDelegate selectionDidChange:self]; 
    } 
} 

@end 
+0

'inputDelegate' 메소드 만 호출하기 때문에이 코드는 우연히 작동합니다. 나는 이것을 할 것이다'self.selectedRange = NSMakeRange (0, self.text.length);' –

관련 문제