2011-12-05 2 views
0

이 문제를 해결하는 가장 좋은 방법을 찾을 수없는 것 같습니다. 사용자가 소수점을 누르면 다음 텍스트 필드로 이동합니다. 내가 가지고있는 문제는 다음 텍스트 필드에 십진수를 표시하고 십진수 만 입력하면 작동합니다. 내가 진술을 시작하는 방식 때문에 왜 십진수 만 허용하는지 이해할 수 있다고 믿는다. 그러나 나는 최선의 접근법을 여기에서 파악할 수 없다.shouldChangeCharactersInRange 논리

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{ 
    NSString *decmial = @"."; 

    if ([textField.text isEqualToString:@"."]) 
    { 
     if (octet1.text == decmial) { 
      octet1.text = [octet1.text stringByReplacingOccurrencesOfString:decmial withString:@""]; 
      [octet1 isFirstResponder]; 
      [octet2 becomeFirstResponder]; 
     } 
     else if (octet2.text == decmial) { 
      octet2.text = [octet2.text stringByReplacingOccurrencesOfString:decmial withString:@""]; 
      [octet2 isFirstResponder]; 
      [octet3 becomeFirstResponder]; 
     } 
     else if (octet3.text == decmial) { 
      octet3.text = [octet3.text stringByReplacingOccurrencesOfString:decmial withString:@""]; 
      [octet3 isFirstResponder]; 
      [octet4 becomeFirstResponder]; 
     } 
     else if (octet4.text == decmial) { 
      octet4.text = [octet4.text stringByReplacingOccurrencesOfString:decmial withString:@""]; 
      [octet4 isFirstResponder]; 
      [myBitMask becomeFirstResponder]; 
     } 
    } 
    return YES; 
} 

답변

0

현재 수정중인 텍스트 필드의 전체 콘텐츠가 정확히 "."인 경우에만 작업을 수행합니다. 어떤 관계없이

if ([string isEqualToString:@"."]) { 

그런 다음 차례로 텍스트 필드의 각 테스트로 이동 : 난 당신이 정말 사용자가 대신에, 대체 문자열과 비교하여 해당 입력되지 않았는지 테스트해야한다고 가정 실제 텍스트 필드가 수정되는 경우 (함수에 전달 된 텍스트 필드) 당신은 각각을 검사하여 그것이 정확히 "."인지 확인하려고 노력합니다. (isEqualToString 대신에 ==를 사용하기 때문에 그렇지 않다는 것을 제외하고), 그렇다면 사용자가 방금 타이핑 한 것에 의해 전체 문자열을 대체합니다. 참으로 이상한! 요는 무엇을 원하는 당신의 설명을 바탕으로

, 어떻게 대해 : 사용자가 다음 번호를 입력 할 때 소수가 아닌

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{ 
    NSString *decmial = @"."; 

    if ([string isEqualToString:decmial]) 
    { 
     textField.text = [textField.text stringByReplacingOccurrencesOfString:decmial withString:@""]; 

     if (textField == octet1) { 
      [octet2 becomeFirstResponder]; 
     } 
     else if (textField == octet2) { 
      [octet3 becomeFirstResponder]; 
     } 
     else if (textField == octet3) { 
      [octet4 becomeFirstResponder]; 
     } 
     else if (textField == octet4) { 
      [myBitMask becomeFirstResponder]; 
     } 

     // We've done the replacement ourselves and moved to the next field. Don't allow the system to accept the change 

     return NO; 
    } 

    // Default behavior 

    return YES; 
} 
+0

큰이 소수를 제외했다가 다음 텍스트 필드에 밀려 점점 계속 그렇게 소수가있다 누르면 다음 텍스트 필드로 이동합니다. 텍스트 필드에 십진수를 넣지 않게하려면 어떻게합니까? – Taken

+0

코드를 수정했습니다. OS가 대체 작업을 수행하지 않도록 NO를 리턴해야합니다 (이미 완료 했음). – tarmes

+0

그래, 그랬어,하지만 지금은 숫자 제외하지 않습니다. – Taken

관련 문제