2011-12-03 2 views
2

나는 내 대답, 사이트를 검색했으나이 문제에 대해 어떻게 생각하는지 또한 생각합니다.NSString을 숫자로 제한하고 # 문자를 입력 한 경우. (코드 포함)

필자는 텍스트 필드를 10 자와 숫자로만 제한하려고합니다.

아래는이 사이트의 다른 질문에 주로 사용되는 코드입니다. 내가 뭘하려고 매쉬 내 한계 함께이 코드

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{ 
    NSCharacterSet *cs = [[NSCharacterSet characterSetWithCharactersInString:LEGAL] invertedSet]; 
    NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""]; 
    NSString *newString = [myTextField.text stringByReplacingCharactersInRange:range withString:filtered]; 
    return !([newString length] > 10); 
} 

이 내 텍스트 필드를 클릭 할 때까지 내 빌드에 문제가 없습니다 ...하지만 난 스레드가 중단 점에서 중지 "라는 녹색 화살표 경고를 1 " 지금은 여러 가지 시도를 해봤지만 지금은 저주 받았다고 느낍니다. 저는 여기가 누군가에게 진정으로 쉬운 일이되기를 바라고 있습니다 ...

그들은 각각 (하나 또는 다른) 작동합니다. 아래 코드를 참조하십시오. 그러나 함께 작업하게 만들 수는 없습니다.

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{ 
    NSString *newString = [myTextField.text stringByReplacingCharactersInRange:range withString:string]; 
    return !([newString length] > 10); 
} 

은 ...

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{ 
    NSCharacterSet *cs = [[NSCharacterSet characterSetWithCharactersInString:LEGAL] invertedSet]; 
    NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""]; 
    return [string isEqualToString:filtered]; 
} 

이것은 또한에만 문제없이 번호로 내 입력을 제한 10 및 내 입력을 제한합니다. 을 제공했습니다. LEGAL을 숫자로만 정의했습니다 ...

나는 그들과 함께 일할 수없는 것처럼 보입니다 ... 아무도이 하나 도와 줄 수 있습니까 ???

+0

정확한 예외를 얻으려면 NSZombieEnable을 설정하십시오. 그것은 콘솔에서 자세한 예외를 보여줍니다. 예외를 찾아서 게시하십시오. –

+0

중단 점을 치고 있습니다. 멈추고 "스레드가 중단 점 1에서 중지되었습니다"라고 말합니다. 중단 점을 제거하거나 (Command + 6을 치면 쉽게 찾을 수 있음) 중단 점을 비활성화하십시오. – NJones

답변

1

이 작업을 수행하는 방법에는 여러 가지가 있습니다,하지만 난이 가장 이해할 수 있다고 생각 : '

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{ 
    // Check for non-numeric characters 
    NSUInteger lengthOfString = string.length; 
    for (NSInteger loopIndex = 0; loopIndex < lengthOfString; loopIndex++) { 
     unichar character = [string characterAtIndex:loopIndex]; 
     if (character < 48) return NO; // 48 unichar for 0 
     if (character > 57) return NO; // 57 unichar for 9 
    } 
    // Check for total length 
    NSUInteger proposedNewLength = textField.text.length - range.length + string.length; 
    if (proposedNewLength > 10) return NO; 
    return YES; 
} 

첫 번째 섹션은 본질적으로'0 '이 아닐 사이에 문자가 아닌 빈 문자열을 확인하고 9 '새 문자열에서 아무 곳이나 찾으면 편집을 거부합니다. 두 번째는 편집이 완료되면 텍스트의 길이를 결정하고 높으면 편집을 거부합니다. 함수가 모든 테스트를 통과하면 편집이 허용됩니다.

내 텍스트 필드를 클릭 할 때까지 내 빌드에 문제가 없는지

...하지만 나는 " thread stopped at breakpoint 1 "

당신은 분명히 당신의 textField:shouldChangeCharactersInRange:replacementString: 방법에 중단 점을 설정 한을 알리는 녹색 화살표 경고를 얻을. (행 번호 컬럼에 파란색 화살표) 그리고 당신은 그들이 오른쪽 그림과 버튼을 사용할 수 있는지 여부를 전환 할 수 있습니다 : 그들은 다음과 같이 브레이크 포인트와 함께 익숙하지 않은 경우

enter image description hereenter image description here

중단 매우 편리합니다. 사용법을 배우는 것이 좋습니다. 그러나 지금은 중단 점을 클릭하고 독에서 아이콘처럼 열에서 드래그하거나 해당 옵션을 해제하십시오.

+0

깜짝 놀랄만 한 것처럼 보였습니다.나는 그렇게하지 않았을 것이다. 내가 upvote 수 있으면 좋겠다! 그것은 완벽하게 작동하며, 중단 점을 읽었습니다. 감사! –

관련 문제