2014-06-05 17 views
6

enter image description hereenter image description hereLàm cách nào để giữ nút hủy trong thanh tìm kiếm được bật khi bàn phím bị loại bỏ?

Tôi đang cố gắng đạt được hiệu ứng tương tự như ứng dụng Danh bạ của Apple (ảnh chụp màn hình bên trái). Nút hủy trong UISearchBar được kích hoạt ngay cả khi bàn phím bị loại bỏ. Ứng dụng của tôi hoạt động khác nhau (ảnh chụp màn hình bên phải). Nút hủy tự động bị tắt khi bàn phím bị loại bỏ. Người dùng buộc phải bấm vào nút hủy bỏ một lần để kích hoạt nó và sau đó một thời gian khác để thực sự kích hoạt việc sa thải. Đây không phải là trải nghiệm người dùng tốt. Tôi sẽ luôn bật nút hủy như ứng dụng Danh bạ của Apple như thế nào?

Chi tiết kỹ thuật:

tôi không sử dụng UISearchDisplayController do một số yêu cầu thiết kế. Đây chỉ là một UISearchBar với bộ điều khiển tìm kiếm tùy chỉnh của riêng tôi. Nút hủy được hiển thị bằng cách sử dụng [self.searchBar showsCancelButton:YES animated:YES]. Bàn phím được loại bỏ bằng cách sử dụng [self.searchBar resignFirstResponder].

+0

Đối với một câu trả lời mạnh mẽ, xem tại đây: https://stackoverflow.com/questions/9968595/how-to-enable-cancel-button-with-uisearchbar/47617904#47617904 –

Trả lời

1

Bạn có thể làm điều này:

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar { 
    [self enableCancelButton]; 
} 

- (void)enableCancelButton { 
    for (UIView *view in _seachBar.subviews) { 
     if ([view isKindOfClass:[UIButton class]]) { 
      [(UIButton *)view setEnabled:YES]; 
     } 
    } 
} 

NHƯNG đây là một phương pháp khá hackish và tôi khá chắc chắn nó thường ấy tán thành bởi Apple và có thể dẫn đến các ứng dụng bị từ chối. Theo tôi biết, dường như không có cách nào khác để làm những gì bạn đang cố gắng làm.

2

Vì iOS 7 tất cả các chế độ xem con của UISearchBar đều sâu hơn một cấp. Điều này sẽ hoạt động:

for (UIView *subView in searchBar.subviews) { 
    for (UIView *secondLevelSubview in subView.subviews) { 
     if ([view isKindOfClass:[UIButton class]]) { 
      [(UIButton *)view setEnabled:YES]; 
     } 
} 

Vẫn còn hack và có thể dễ dàng đột nhập trong phiên bản iOS tiếp theo.

5

Bạn có thể sử dụng API thời gian chạy để truy cập nút hủy.

UIButton *btnCancel = [self.searchBar valueForKey:@"_cancelButton"]; 
[btnCancel setEnabled:YES]; 

Theo như câu hỏi của bạn, không có cách nào bạn có thể bật nút hủy khi bàn phím bị loại bỏ, như không có gọi lại như vậy.

0

Thực hiện tìm kiếm bên dướiBarShouldEndChỉnh sửa phương thức ủy nhiệm trong mã của bạn. Hy vọng nó sẽ hữu ích.

(BOOL)searchBarShouldEndEditing:(UISearchBar *)searchBar 
{ 
    [[searchBar valueForKey:@"_cancelButton"] setEnabled:YES]; 
    return YES; 
} 
+0

Đối với tôi, cancelButton vẫn được kích hoạt tại thời điểm đó, vì vậy nó không giúp kích hoạt nó ở đây. –

3

Gọi để [self.searchBar resignFirstResponder] sẽ làm cho nút hủy vô hiệu hóa. Do đó, bạn nên luôn cập nhật nút hủy để bật sau khi gọi.

Objective-C

[searchBar resignFirstResponder]; 
UIButton *cancelButton = (UIButton *)[searchBar valueForKey:@"cancelButton"]; 
[cancelButton setEnabled:YES]; 

Swift

searchBar.resignFirstResponder() 
if let cancelButton = searchBar.value(forKey: "cancelButton") as? UIButton 
    cancelButton.isEnabled = true 
} 

Theo kinh nghiệm của tôi, view.endEditing(true) là vấn đề. Bởi vì nó còn được gọi là .resignFirstResponder nếu có một UITextField bên trong khung nhìn, được chứa trong UISearchBar.

https://developer.apple.com/reference/uikit/uiview/1619630-endediting

1

Đây là giải pháp đệ quy làm việc cho tôi.

func enableButtons(_ view:UIView) { for subView in view.subviews { enableButtons(subView) } if let buttonView = view as? UIButton { buttonView.isEnabled = true } }

Các vấn đề liên quan