2009-05-29 27 views
35

Tôi có một UISearchBar trong giao diện của mình và tôi muốn tùy chỉnh hành vi của nút nhỏ rõ ràng xuất hiện trên thanh tìm kiếm sau khi một số văn bản được nhập vào (đó là một vòng tròn nhỏ màu xám có chữ thập trong đó, xuất hiện trên bên phải của trường tìm kiếm). Về cơ bản, tôi muốn nó không chỉ xóa văn bản của thanh tìm kiếm (là cài đặt mặc định) mà còn xóa một số nội dung khác khỏi giao diện của tôi, nhưng gọi một trong các phương thức của riêng tôi.Tôi có thể móc vào nút Xóa của UISearchBar không?

Tôi không thể tìm thấy bất kỳ nội dung nào trong tài liệu cho lớp UISearchBar hoặc giao thức UISearchBarDelegate - có vẻ như bạn không thể trực tiếp có quyền truy cập vào hành vi này.

Một trong những điều tôi đã làm lưu ý là các tài liệu giải thích rằng phương pháp đại biểu:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText; 

được gọi sau khi nút rõ ràng được khai thác. Ban đầu, tôi đã viết một số mã trong phương thức đó đã kiểm tra thuộc tính văn bản của thanh tìm kiếm và nếu nó trống, thì nó đã bị xóa và làm tất cả những thứ khác của tôi.

Hai vấn đề mà mặc dù điều này:

Thứ nhất, đối với một số lý do tôi không thể hiểu được, mặc dù tôi nói với thanh tìm kiếm để resignFirstResponder ở phần cuối của phương pháp của tôi, một cái gì đó, ở đâu đó là thiết lập lại cho becomeFirstResponder. Thực sự khó chịu ...

Thứ hai, nếu người dùng không sử dụng nút rõ ràng và chỉ xóa văn bản trong thanh bằng cách sử dụng nút xóa trên bàn phím, phương pháp này được tắt và kết quả tìm kiếm của họ biến mất. Không tốt.

Mọi lời khuyên hoặc con trỏ đi đúng hướng sẽ thật tuyệt vời!

Cảm ơn!

Trả lời

1

Tôi khuyên bạn nên sử dụng phương pháp rightViewrightViewMode của UITextField để tạo nút rõ ràng của riêng bạn sử dụng cùng một hình ảnh. Tôi giả định tất nhiên là UISearchBar sẽ cho phép bạn truy cập vào UITextField bên trong nó. Tôi nghĩ nó sẽ.
Hãy nhận biết điều này từ Thư viện tham khảo hệ điều hành iPhone:

If an overlay view overlaps the clear button, however, the clear button always takes precedence in receiving events. By default, the right overlay view does overlap the clear button.

Vì vậy, bạn sẽ có lẽ cũng cần phải tắt nút gốc rõ ràng.

+1

Tôi khá chắc chắn rằng UISearchBar không vạch trần nó texfield ... – Jasarien

7

Tôi có mã này trong ứng dụng của mình. Sự khác biệt là tôi không hỗ trợ 'tìm kiếm trực tiếp', mà thay vào đó hãy bắt đầu tìm kiếm khi người dùng chạm vào nút tìm kiếm trên bàn phím:

- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar { 
    if ([searchBar.text isEqualToString:@""]) { 
     //Clear stuff here 
    } 
} 
+0

1 Tôi đồng ý với câu trả lời này. Nếu văn bản trống, sau khi được xóa thì nó phải có nghĩa là nút rõ ràng đã được nhấn. @Jasarien bạn có tìm thấy giải pháp không? – JoePasq

+0

Sử dụng Surley - (void) searchBar: (UISearchBar *) searchBar textDidChange: (NSString *) searchText thay vào đó, nếu không bạn cần phải từ chức trả lời đầu tiên trong suốt, người dùng sẽ không bao giờ có thể chọn hộp, vì nó sẽ trống khi họ bắt đầu. – Marc

1

Vì đây đi lên đầu tiên, và xa như tôi có thể xem các câu hỏi là không thực sự đầy đủ giải quyết, tôi nghĩ tôi sẽ đăng giải pháp của mình.

1) Bạn cần có tham chiếu đến textField bên trong searchBar 2) Bạn cần nắm bắt rõ ràng rằng textField rõ ràng khi nó kích hoạt.

Điều này khá đơn giản. Đây là một cách.

a) Đảm bảo bạn tạo lớp học của mình, vì bạn sẽ sử dụng phương thức ủy nhiệm của textField bên trong thanh tìm kiếm. b) Đồng thời, hãy kết nối thanh tìm kiếm của bạn với một Ổ cắm trong lớp học của bạn. Tôi vừa gọi cho tôi searchBar. c) từ viewDidLoad bạn muốn nhận được ahold của textField bên trong searchBar. Tôi đã làm như thế này

UITextField *textField = [self.searchBar valueForKey:@"_searchField"]; 
if (textField) { 
    textField.delegate = self; 
    textField.tag = 1000; 
} 

Lưu ý, tôi đã gán thẻ cho văn bản đóĐể tôi có thể lấy lại thẻ và tôi đã đặt nó làm đại biểu cho văn bản. Bạn có thể đã tạo một thuộc tính và gán textField này cho thuộc tính đó để lấy nó sau này, nhưng tôi đã sử dụng một thẻ.

Từ đây bạn chỉ cần gọi phương thức đại biểu:

-(BOOL)textFieldShouldClear:(UITextField *)textField { 
if (textField.tag == 1000) { 
    // do something 
    return YES; 
} 
return NO; 

}

Vậy là xong. Vì bạn đang đề cập đến một giá trị riêng tưForKey Tôi không thể đảm bảo rằng nó sẽ không giúp bạn gặp rắc rối.

+1

Cảm ơn u rất nhiều dude – SampathKumar

0

giải pháp tốt nhất từ ​​kinh nghiệm của tôi chỉ là để đặt một UIButton (với lý lịch rõ ràng và không có văn bản) trên nút hệ thống rõ ràng và hơn kết nối một IBAction

- (IBAction)searchCancelButtonPressed:(id)sender { 

    [self.searchBar resignFirstResponder]; 
    self.searchBar.text = @""; 

    // some of my stuff 
    self.model.fastSearchText = nil; 
    [self.model fetchData]; 
    [self reloadTableViewAnimated:NO]; 

} 
17

Tìm thấy các giải pháp tốt hơn cho vấn đề này :)

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{ 
    if ([searchText length] == 0) { 
     [self performSelector:@selector(hideKeyboardWithSearchBar:) withObject:searchBar afterDelay:0]; 
    } 
} 

- (void)hideKeyboardWithSearchBar:(UISearchBar *)searchBar{ 
    [searchBar resignFirstResponder]; 
} 
+0

Tnx tốt lừa, tôi thêm phiên bản Swift 2 như một câu trả lời dưới đây – ergunkocak

1

Bạn có thể thử này:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    for (UIView *view in searchBar.subviews){ 
     for (UITextField *tf in view.subviews) { 
      if ([tf isKindOfClass: [UITextField class]]) { 
       tf.delegate = self; 
       break; 
      } 
     } 
    } 
} 

- (BOOL)textFieldShouldClear:(UITextField *)textField { 
    // your code 
    return YES; 
} 
+2

Không làm việc cho tôi trên iOS 9 với Swift 2. Crashes với lỗi '_searchController]: unrecognized selector gửi đến instance' – Sunkas

0

Đã không thể vây d giải pháp ở đây không sử dụng API riêng tư hoặc không được nâng cấp bằng chứng trong trường hợp Apple thay đổi cấu trúc khung nhìn của UISearchBar. Dưới đây là những gì tôi đã viết rằng hoạt động:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    UITextField* textfield = [self findTextFieldInside:self.searchBar]; 
    [textfield setDelegate:self]; 
} 

- (UITextField*)findTextFieldInside:(id)mainView { 
    for (id view in [mainView subviews]) { 
     if ([view isKindOfClass:[UITextField class]]) { 
      return view; 
     } 

     id subview = [self findTextFieldInside:view]; 
     if (subview != nil) { 
      return subview; 
     } 
    } 

    return nil; 
} 

Sau đó, thực hiện các giao thức UITextFieldDelegate vào lớp học của bạn và ghi đè lên textFieldShouldClear: phương pháp.

- (BOOL)textFieldShouldClear:(UITextField*)textField { 
    // Put your code in here. 
    return YES; 
} 

Edit: Thiết các đại biểu vào textfield của một thanh tìm kiếm trong iOS8 sẽ tạo ra một vụ tai nạn. Tuy nhiên có vẻ như phương thức searchBar: textDidChange: sẽ được gọi trên iOS8.

6

Swift phiên bản xử lý bàn phím gần trên rõ ràng nút bấm:

func searchBar(searchBar: UISearchBar, textDidChange searchText: String) { 
    if searchText.characters.count == 0 { 
     performSelector("hideKeyboardWithSearchBar:", withObject:searchBar, afterDelay:0) 
    } 
} 

func hideKeyboardWithSearchBar(bar:UISearchBar) { 
    bar.resignFirstResponder() 
} 
Các vấn đề liên quan