2014-04-03 4 views
7

UISearchBar에서 실행 취소하려고하면 내 앱이 다운됩니다. 내 응용 프로그램에서 나는 검색 창에 '%'기호를 입력 방지 코드를 가지고이 일 것이에 %를 대체 @ "ABC"아래 textDidChange 방법에 따라서"[NSBigMutableString substringWithRange :] 범위 초과 {0, 10} 문자열 길이 9"실행 취소 오류

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText 
{ 
    self.searchBar.text = [searchText stringByReplacingOccurrencesOfString:@"%" withString:@""]; 
} 

내가 텍스트를 입력하면 " % xyz "이면 검색 막대에 표시되는 마지막 텍스트는 'abcxyz'입니다. 아니요, 실행 취소를 클릭하면 'xyz'가 지워지고 한 번에 'abcxyz'를 지우지 않고 검색 창에 'abc'가 표시됩니다.

이제 'abc'를 지우려면 다시 실행 취소를 클릭하면 [NSBigMutableString substringWithRange:]: Range out of bounds 오류로 인해 앱이 다운됩니다.

'%'가 @ ""로 대체 되더라도 실행 취소 관리자가 여전히이를 보유하고 있으므로 범위가 범위를 벗어나고 있다고 가정합니다.

%를 @ ""로 바꾼 후에 textDidChange[searchBar.undoManager removeAllActions];을 시도했지만 도움이되지 않았습니다. 여기 코드는 다음과 같습니다

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText 
    { 
     self.searchBar.text = [searchText stringByReplacingOccurrencesOfString:@"%" withString:@""]; 
     [searchBar.undoManager removeAllActions]; 
    } 

질문 : 누구 이전에 유사한 문제에 직면? 실행 취소는 어떻게 처리합니까?

+0

는 removaAllActions은 나를 위해 일하지만. 우리는 마침내 흔들어서 앱 실행을 취소했습니다. – SuperGuyAbe

답변

1

당신은 대신 대리인이 방법을 사용한다 :

 - (BOOL)searchBar:(UISearchBar *)searchBar 
    shouldChangeTextInRange:(NSRange)range 
      replacementText:(NSString *)text 

을 그리고 단지의 경우 NO 반환 replacementText는 "%"와 동일합니다. 이렇게하면 텍스트 필드를 업데이트하지 않으므로 사용자가 처음 사용하는 것을 막을 수 있습니다. 이렇게하면 실행 취소 문제가 해결됩니다.

솔루션

- (BOOL)searchBar:(UISearchBar *)searchBar shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text 
{ 
    if([text isEqualToString:@"%"]) { 
     return NO; 
    } 

    return YES; 
}