2014-04-03 19 views
7

Ứng dụng của tôi gặp sự cố khi tôi cố hoàn tác trên UISearchBar. Trong ứng dụng của tôi, tôi có mã để ngăn chặn bước vào một '%' dấu trên thanh tìm kiếm và để làm điều này nó sẽ thay thế một% đến @ "" trong textDidChange phương pháp như sau:"[NSBigMutableString substringWithRange:]: Phạm vi {0, 10} vượt quá giới hạn, lỗi chuỗi 9" với Undo

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

Vì vậy, nếu tôi gõ văn bản "abc % xyz ", văn bản cuối cùng hiển thị trên thanh tìm kiếm sẽ là 'abcxyz'. Không khi tôi nhấp vào hoàn tác, tôi thấy 'xyz' bị xóa và tôi vẫn thấy 'abc' trên thanh tìm kiếm thay vì xóa 'abcxyz' tất cả cùng một lúc.

Bây giờ, nếu tôi nhấp lại hoàn tác để xóa 'abc', ứng dụng của tôi gặp sự cố với lỗi [NSBigMutableString substringWithRange:]: Range out of bounds.

Tôi giả định rằng mặc dù '%' được thay thế bằng @ "", trình quản lý hoàn tác có thể vẫn giữ nó và do đó phạm vi sẽ vượt quá giới hạn.

Tôi đã thử [searchBar.undoManager removeAllActions]; trong textDidChange sau khi tôi thay% bằng @ "", nhưng không hiệu quả. Đây là mã:

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

Câu hỏi: Bất kỳ ai phải đối mặt với vấn đề tương tự trước đây? Làm cách nào để xử lý hoàn tác?

+0

Mặc dù removaAllActions làm việc cho tôi. Cuối cùng, chúng tôi đã chọn tắt rung để hoàn tác cho ứng dụng của chúng tôi. – SuperGuyAbe

Trả lời

1

Bạn nên sử dụng phương pháp đại biểu này để thay thế:

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

Và chỉ trả NO trong trường hợp replacementText bằng "%". Điều này sẽ ngăn người dùng sử dụng nó ngay từ đầu vì nó sẽ không cập nhật trường văn bản, điều này sẽ khắc phục sự cố hoàn tác bạn đang gặp phải.

Giải pháp

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

    return YES; 
} 
Các vấn đề liên quan