2011-12-16 26 views
9

Sử dụng UISearchBar với showCancelButton = YES trên iOS 5. Có nút hủy để luôn bật khi bàn phím rơi xuống. Việc sử dụng mã sau dường như không hoạt động:Nút hủy UISearchBar

for (id subView in self.searchControl.subviews) 
    { 
     if ([subView isKindOfClass:[UIButton class]]) 
     { 
      UIButton *cancelButton = (UIButton *)subView; 
      [cancelButton setEnabled:YES]; 
      break; 
     }   
    } 

SubView thực sự là một nút UINavigation xuất hiện không được phân lớp ra khỏi UIButton. Tôi đang thiếu gì ở đây ??????? Cũng không thể tìm thấy bất kỳ thông tin nào trên lớp UINavigationButton trong tài liệu của Apple.

+0

Tính đến bây giờ, không ai trong số các câu trả lời giải thích làm thế nào bạn có nghĩa vụ phải tìm ra nút hủy. Câu trả lời của Byte, ví dụ chỉ sử dụng isKindOfClass: UIButton, mà OP đã nói không hoạt động. Vì UINavigationButton là một lớp không có giấy tờ, điều đó có nghĩa là mọi thư được gửi tới đối tượng sẽ khiến ứng dụng của bạn bị từ chối không? –

Trả lời

1

Tôi phải giải quyết cùng một vấn đề trong đơn đăng ký của mình. Hãy thử làm mã trên của bạn sau một sự chậm trễ phân đoạn, ví dụ:

[self performSelector:@selector(delayedEnable:) withObject:cancelButton afterDelay:0.001]; 

- (void)delayedEnable:(UIButton*)button { 
    button.enabled = YES; 
} 

Thật xấu xí, nhưng đó là những gì nó cần để làm việc cho tôi. Ngoài ra, nếu bạn thực sự sử dụng một UISearchDisplayController để hiển thị kết quả, nó cũng nên sửa chữa hành vi nút hủy bỏ cho bạn (Tôi nghĩ rằng - Tôi đã delved vào vấn đề này ít hơn).

+0

Điều này làm việc như một phép thuật .. @ Kurt Bạn có thể cho tôi biết từ nơi bạn đã nhận được điều này? Amazing..upvoted – NSPratik

2

Chỉ để cải thiện những gì Kurt Spindler đã nói trên bài đăng của mình. Mặc dù điều này có thể không được cấp trên nhưng nó chứa đựng nhiều hơn. Tôi sử dụng công văn để làm điều tương tự.

-(void)searchBarTextDidEndEditing:(UISearchBar *)searchBar{ 
    for (UIView *subview in searchBar.subviews) 
    { 
     if ([subview isKindOfClass:[UIButton class]]) 
     { 
      int64_t delayInSeconds = .001; 
      dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); 
      dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
       UIButton * cancelButton = (UIButton *)subview; 
       [cancelButton setEnabled:YES]; 
      }); 
      break; 
     } 
    } 
} 

Điều này sẽ phù hợp với mọi người cần trợ giúp để bật hủy kích hoạt. Hãy chắc chắn rằng bạn ẩn nó sau này hoặc với việc hủy bỏ hoặc tìm kiếm nhấp vào.

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar{ 
    [searchBar resignFirstResponder]; 
    [searchBar setShowsCancelButton:NO animated:YES]; 
} 
+0

Nếu bạn muốn thực hiện điều gì đó không đồng bộ, chỉ cần sử dụng dispatch_async. Bạn không cần dispatch_after với một "giá trị trễ gần như ngay lập tức". Ví dụ.trong trường hợp này 'dispatch_async (dispatch_get_main_queue(),^(void) {...});' hoạt động hoàn toàn ổn. –

+0

Tôi tin rằng 0,001 là cần thiết dựa trên câu trả lời của Kurt. Nếu đó không phải là trường hợp, thì cách tiếp cận của bạn sẽ hoàn toàn chấp nhận được. – Byte

2

Tôi đã đặt nút hủy tùy chỉnh trên nút hủy thanh tìm kiếm.

16

Đặt đại biểu trên thanh tìm kiếm của bạn và đặt mã này.

- (void) searchBarSearchButtonClicked:(UISearchBar*) theSearchBar 
    { 
    [theSearchBar resignFirstResponder]; 
    [theSearchBar setShowsCancelButton:NO animated:YES]; 
    } 
- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar 
    { 
    [searchBar setShowsCancelButton:YES animated:YES]; 
    } 
    - (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar 
    { 
    [searchBar resignFirstResponder]; 
    [searchBar setShowsCancelButton:NO animated:YES]; 
    } 

Swift 3,0

func searchBarSearchButtonClicked(_ searchBar: UISearchBar) { 
    searchBar .resignFirstResponder() 
    searchBar.setShowsCancelButton(false, animated: true) 
} 
func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) { 
    searchBar.setShowsCancelButton(true, animated: true) 
} 
func searchBarCancelButtonClicked(_ searchBar: UISearchBar) { 
    searchBar.resignFirstResponder() 
    searchBar.setShowsCancelButton(false, animated: true) 
} 
1

Tôi biết một điều này là cũ, nhưng tôi đã có thể giải quyết nó và tôi không thể tìm thấy bất cứ điều gì khác trên SO mà giải quyết nó đối với tôi, vì vậy đây là những gì làm việc (trong Swift 3):

Bật nút hủy khi bàn phím ẩn. Thêm phần này vào viewDidLoad():

NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardNotification(notification:)), name: NSNotification.Name.UIKeyboardDidHide, object: nil) 

trong keyboardNotification (thông báo :) phương pháp, phản ứng với các thông báo keyboardDidHide:

func keyboardNotification(notification: NSNotification) { 
    if notification.name == Notification.Name.UIKeyboardDidHide { 
     self.enableSearchCancelButton() 
    } 
} 

Các enableSearchCancelButton được lấy từ những gì người khác đã trả lời here.

func enableSearchCancelButton() { 
    //enable the cancel button 
    for view1 in searchBar.subviews { 
     for view2 in view1.subviews { 
      if let button = view2 as? UIButton { 
       button.isEnabled = true 
       button.isUserInteractionEnabled = true 
      } 
     } 
    } 
} 

Cuối cùng, đừng quên để loại bỏ các điều khiển xem như một người quan sát:

deinit { 
    NotificationCenter.default.removeObserver(self) 
} 
Các vấn đề liên quan