首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

iOS UISearchBar清除按鈕常駐顯示的自定義實現方案

     編輯:程式設計綜合問答

通過自定義UIButton實現SearchBar清除按鈕永久可見

iOS原生UISearchBar的清除按鈕(X按鈕)默認僅在編輯且有文本時顯示。若需「文本為空時也常駐顯示」,需繞過私有API限制,採用自定義右視圖方案。

原生屬性局限性

// 僅支持以下模式,無「始終顯示」
textField.clearButtonMode = UITextFieldViewModeWhileEditing;  // 編輯時顯示(默認)
textField.clearButtonMode = UITextFieldViewModeUnlessEditing; // 非編輯時顯示
textField.clearButtonMode = UITextFieldViewModeAlways;        // 編輯時始終顯示(但無文本時隱藏)
textField.clearButtonMode = UITextFieldViewModeNever;         // 從不顯示

即使設置UITextFieldViewModeAlways,文本為空時系統仍會隱藏按鈕。

解決方案:自定義右視圖按鈕

- (void)setupPersistentClearButton {
    // 1. 獲取內部UITextField(iOS 13+ 建議用searchTextField屬性)
    UITextField *textField = self.searchBar.searchTextField; // iOS 13+
    // 兼容舊版:遍歷subviews查找UITextField
    
    // 2. 創建自定義清除按鈕
    UIButton *clearButton = [UIButton buttonWithType:UIButtonTypeCustom];
    [clearButton setImage:[UIImage imageNamed:@"search_clear_icon"] forState:UIControlStateNormal];
    [clearButton setFrame:CGRectMake(0, 0, 20, 20)];
    [clearButton addTarget:self action:@selector(clearSearchText:) forControlEvents:UIControlEventTouchUpInside];
    
    // 3. 設置為右視圖,模式為始終顯示
    textField.rightView = clearButton;
    textField.rightViewMode = UITextFieldViewModeAlways;
    
    // 4. 可選:隱藏原生清除按鈕避免雙重顯示
    textField.clearButtonMode = UITextFieldViewModeNever;
}

- (void)clearSearchText:(UIButton *)sender {
    self.searchBar.text = @"";
    [self.searchBar.delegate searchBar:self.searchBar textDidChange:@""];
    // 若需觸發搜索邏輯,手動調用 delegate 方法
}

關鍵點說明

  1. 獲取TextField:iOS 13+直接用searchBar.searchTextField;舊版需遍歷subviews查找UITextField類。
  2. 右視圖模式:UITextFieldViewModeAlways確保按鈕始終可見,無論文本長度、編輯狀態。
  3. 圖標資源:建議使用SF Symbols(UIImage(systemName: "xmark.circle.fill"))或自定義圖片,適配深色模式。
  4. 代理同步:手動清空文本後,需主動通知UISearchBarDelegate觸發searchBar:textDidChange:保持邏輯一致。

Swift版本速查

let clearButton = UIButton(type: .custom)
clearButton.setImage(UIImage(systemName: "xmark.circle.fill"), for: .normal)
clearButton.addTarget(self, action: #selector(clearTapped), for: .touchUpInside)
searchBar.searchTextField.rightView = clearButton
searchBar.searchTextField.rightViewMode = .always
searchBar.searchTextField.clearButtonMode = .never

@objc func clearTapped() {
    searchBar.text = ""
    searchBar.delegate?.searchBar?(searchBar, textDidChange: "")
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved