2011-01-12 4 views
8

mytextField의 텍스트를 편집하는 데 사용하는 사용자 지정 키보드가 있는데 잘 작동합니다. 그러나 shouldChangeCharactersInRange 대리자는 내 사용자 지정 키보드를 사용하여 실행할 수 없습니다. 실제 키보드 (mytextField.inputView = numberPad.view를 설정했기 때문에 분명히 기본 iPhone 키보드가 아님)를 사용할 때 실행됩니다. 사용자 지정 키보드를 사용하여 shouldChangeCharactersInRange 대리인이 실행되도록하려면 어떻게해야합니까? BTW, 사용자 정의 키보드는 버튼의 무리입니다.사용자 정의 inputView를 사용하여 UITextFieldDelegate.shouldChangeCharactersInRange를 실행하려면 어떻게해야합니까?

- (void) numberPadPressed: (UIButton *)sender { 
    [mytextField insertText:[[NSNumber numberWithInt:sender.tag] stringValue]]; 
} 

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 
    NSString *resultingString = [textField.text stringByReplacingCharactersInRange: range withString: string]; 
    NSLog(@"shouldChangeCharactersInRange: %@", resultingString); 
    return true; 
} 

- (void)viewDidLoad { 
    mytextField.text = @""; 
    mytextField.inputView = numberPad.view; 
    mytextField.delegate = self; 
    [mytextField becomeFirstResponder]; 
} 

답변

0

편집 : 죄송합니다. 이전에 질문에 대한 오해. 그것은 당신에게 텍스트가 실제로 (예를 들어 바로 가기를 인식하고 좀 더 긴 텍스트를 삽입을 구현할 수)를 표시할지 여부를 결정 할 수있는 기회를주는 시스템 키보드에서 입력을 취득하는 경우

텍스트 필드 shouldChangeCharactersInRange를 호출합니다. 그러나 텍스트 필드는 사용자 정의보기의 입력을 텍스트 입력으로 인식하지 못합니다.

사용자 정의 inputView이있는 경우,이 메소드를 호출 할 필요가 없습니다 - 당신의 IBAction를 직접 텍스트 필드를 바로 업데이트 : 당신은 사용자 정의 키보드라는 shouldChangeCharactersInRange를 얻을하지 않습니다

- (IBAction) numberPadPressed: (UIButton *)sender { 
    NSString *newText = [[mytextField text] stringByReplacingCharactersInRange:[mytextField selectedRange] withString:string]; 
    [mytextField setText:newText]; 
} 
+0

위 제안에 따라 테스트했지만 numberPadPressed가 호출 될 때 shouldChangeCharactersInRange가 실행되지 않았습니다. 나는 우리가 올바른 길에 있다고 생각합니다 ... – docchang

+0

어떻게 범위를 계산합니까? TextField의 특정 위치에서 커서를 움직이는 방법이 있습니까? – docchang

+0

코드 샘플을 업데이트했습니다. [mytextField selectedRange]를 사용하여 선택한 범위를 가져옵니다. 선택 영역이 없으면 삽입 점이 될 것이고 선택 영역이 있으면 범위가 될 것입니다. –

10

.

UITextField의 이벤트는 UIControlEventEditingChanged입니다. 따라서 버그가있는 것으로 알려진 shouldChangeCharactersInRange 메서드에 의존하는 대신 사용자가 텍스트 필드의 내용을 변경할 때마다 발생하는이 이벤트에 의존해야합니다. 당신이 자신에게 사용자 정의 키보드로 텍스트 필드를 수정하는 경우

[textField addTarget:self action:@selector(myTextfieldChangedMethod:) forControlEvents:UIControlEventEditingChanged]; 

, 그냥 이벤트 UIControlEventEditingChanged의 모든 청취자에게 통지하기 위해서이 메소드를 호출한다.

[textField sendActionsForControlEvents:UIControlEventTouchUpInside]; 
+0

'forControlEvents'가 'sendActionsForControlEvents'와 일치해야합니다. –

0

나는이 오래된 질문은 알고 있지만 나는 사전 5.0 장치를 지원하기 위해 필요에 동일한 문제로 달렸다. insertText를 오버라이드하면 : http://dev.ragfield.com/2009/09/insert-text-at-current-cursor-location.html에서 Rob의 지시에 따라 shouldChangeCharactersInRange가 매번 실행됩니다.

난 당신이 How to simulate the delete key on UITextField?

에서 @cormacrelf에서 답을 사용할 수있다처럼 당신은 내가 해결할 수 없었던 유일한 혼란은 당신이에서 문자를 삭제하는 경우이다 백 스페이스 키를 지원해야하는 경우 문자열의 중간에 커서가 문자열의 끝으로 다시 점프합니다.

관련 문제