2011-12-08 36 views
6

Có cách nào để chọn tất cả văn bản trong UISearchBar không? Tôi đã thử [searchBar selectALL:], nhưng nó ném tín hiệu (bộ chọn không được nhận ra).UISearchBar chọn tất cả văn bản

Tôi muốn cho phép người dùng thay đổi văn bản tìm kiếm trước đó. Vào thời điểm nào đó, khi người dùng chỉ mới bắt đầu nhập yêu cầu mới, yêu cầu cũ sẽ bị loại bỏ. Cách tiêu chuẩn làm thế nào để đạt được nó - chọn tất cả văn bản tại thời điểm khi văn bản bắt đầu chỉnh sửa.

Trả lời

2

Đây là một gợi ý khác: khi ai đó kích hoạt thanh tìm kiếm, có hai ý định có thể: nhập văn bản mới hoặc thêm vào văn bản hiện có. Tôi nghĩ bạn nên cho người dùng lựa chọn.

Nếu anh ấy muốn thêm văn bản, anh ấy sẽ tự động nhấn lại vào cuối văn bản hiện tại.

Nếu anh ấy muốn bắt đầu lại, anh ấy có thể nhấn nút rõ ràng tự động xuất hiện khi thanh tìm kiếm hoạt động.

+0

Vâng, đó là giải pháp tốt nhất. –

+5

Hành vi này khác với Safari trên iOS, chọn văn bản khi bạn chạm vào thanh địa chỉ. – Luke

0

Tôi không nghĩ rằng có một phương pháp để chọn tất cả văn bản. Có lẽ khi có một tập trung vào UISearchBar bạn có thể xóa các thanh tìm kiếm như vậy - searchBar.text = @""

tức là văn bản rõ ràng vào thanh tìm kiếm ... Hope this helps một cách nào đó ...

+0

Trong trường hợp này không có cách nào để sử dụng để thay đổi theo yêu cầu. Nếu nó là một chuỗi dài nó có thể gây phiền nhiễu để gõ lại nó. –

0

Bạn có thể thực hiện điều này bằng cách giữ BOOL cho biết nếu chỉnh sửa trường văn bản trên thanh tìm kiếm vừa mới bắt đầu. Sau đó, bạn có thể bắt phím bấm đầu tiên trong các phương thức ủy nhiệm searchBar.

- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar { 
    firstEdit = YES; 
} 

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

    if (firstEdit) { 
     searchBar.text = text; 
     firstEdit = NO; 
    } 
    return YES; 
} 
+0

Có cách nào để đánh dấu văn bản không? –

4

Nếu bạn muốn chức năng 'loại để thay thế' chọn văn bản trong UITextField cung cấp cho bạn (nghĩa là nhấn bổ sung trên thập tự giá là không thể chấp nhận được), bạn có thể xem qua các phần phụ của UISearchBar để tìm UITextField (hoặc UISearchBarTextField) và chọn văn bản của nó:

// need to select the searchBar text ... 
UITextField * searchText = nil; 
for (UIView *subview in searchBar.subviews) 
{ 
    // we can't check if it is a UITextField because it is a UISearchBarTextField. 
    // Instead we check if the view conforms to UITextInput protocol. This finds 
    // the view we are after. 
    if ([subview conformsToProtocol:@protocol(UITextInput)]) 
    { 
     searchText = (UITextField*)subview; 
     break; 
    } 
} 

if (searchText != nil) 
    [searchText selectAll:self]; 
+2

Lưu ý rằng tính năng này không còn hoạt động trong iOS 7 - trường văn bản hiện được lồng sâu hơn trong cấu trúc phân cấp chế độ xem. Để khắc phục điều này, chỉ cần thay đổi mã thành một phiên bản đệ quy đi qua hệ thống phân cấp cho đến khi nó tìm thấy trường văn bản. Cũng có thể có vấn đề với phương thức "selectAll:", tùy thuộc vào những gì bạn thực sự muốn đạt được. [Xem câu hỏi này để biết thêm chi tiết] (http://stackoverflow.com/questions/1689911/programatically-select-all-text-in-uitextfield). Cũng lưu ý rằng tôi phải gọi nó trong viewDidAppear, không phải viewWillAppear để nó hoạt động. –

9

Điều này có thể được thực hiện bằng cách sử dụng ngữ nghĩa UIResponder chuẩn. Không cần phải đào sâu vào hệ thống phân cấp chế độ xem riêng tư của UISearchBar.

[[UIApplication sharedApplication] sendAction:@selector(selectAll:) to:nil from:nil forEvent:nil] 

Bạn có thể gọi điều này từ bất kỳ đâu và bộ chọn trả lời sẽ xem chuỗi phản hồi có phản ứng gì không. Giả sử thanh tìm kiếm của bạn hiện là người trả lời đầu tiên (nếu người dùng đang gõ vào nó), nó sẽ trả lời và kết quả sẽ là tất cả văn bản được chọn. Nếu không, bạn có thể làm cho nó trở thành người trả lời đầu tiên bằng cách gọi số becomeFirstResponder trên thanh tìm kiếm.

[_mySearchBar becomeFirstResponder] 
[[UIApplication sharedApplication] sendAction:@selector(selectAll:) to:nil from:nil forEvent:nil] 
2

Trong trường hợp của tôi, việc gửi selectAll(_:) đã không làm việc ngay lập tức sau khi gọi becomeFirstResponder.

tôi làm việc xung quanh nó bằng cách đợi một runloop:

Swift 2:

dispatch_async(dispatch_get_main_queue()) { 
    UIApplication.sharedApplication().sendAction(#selector(UITextField.selectAll(_:)), to: nil, from: nil, forEvent: nil) 
} 

Swift 3:

DispatchQueue.main.async(execute: { 
    UIApplication.sharedApplication().sendAction(#selector(UITextField.selectAll(_:)), to: nil, from: nil, forEvent: nil) 
}) 
Các vấn đề liên quan