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 方法
}
searchBar.searchTextField;舊版需遍歷subviews查找UITextField類。UITextFieldViewModeAlways確保按鈕始終可見,無論文本長度、編輯狀態。UIImage(systemName: "xmark.circle.fill"))或自定義圖片,適配深色模式。UISearchBarDelegate觸發searchBar:textDidChange:保持邏輯一致。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: "")
}