「x」ボタンを押したときにイベントをどのように処理しますか?
私はこの方法を試しますが、うまくいきません。
-(void)searchBarCancelButtonClicked:(UISearchBar *)searchBar{
}
Xボタンに接続する簡単な方法はないと思います。
ただし、その直接的な結果、つまりクリアテキストにフックできます。
これを試して:
func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
if searchText == "" {
print("UISearchBar.text cleared!")
}
}
副作用として、手動でテキストをクリアしたときにも呼び出されます。
それを行うにはかなりハッキーな方法ですが、これは機能します。
_private var didTapDeleteKey = false
func searchBar(_ searchBar: UISearchBar,
shouldChangeTextIn range: NSRange,
replacementText text: String) -> Bool
{
didTapDeleteKey = text.isEmpty
return true
}
func searchBar(_ searchBar: UISearchBar,
textDidChange searchText: String)
{
if !didTapDeleteKey && searchText.isEmpty {
// Do something here
}
didTapDeleteKey = false
}
_
このコードの成功は、検索バーのクリアボタンをタップしたときにsearchBar(_:shouldChangeTextIn:replacementText:) -> Bool
が呼び出されないという事実にかかっています。代わりに、キーボードの削除ボタンがタップされると、メソッドが呼び出されます。
Swift 5.0の最も簡単なソリューション
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
if searchText.isEmpty {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
searchBar.resignFirstResponder()
}
}
}
私は同じ問題を抱えていて、searchBarのサブビューtextFieldにアクセスしてそれを解決しようとしましたが、それがアプリのクラッシュを引き起こしました、そして最後の努力で私はこれを見つけました post 。
別の問題は、
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
キャンセルボタンがクリックされたときに2回呼び出されます。 this も参照してください。
そして最後に私がしたことは
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
if (![searchText isEqualToString:self.searchText]) {
self.searchText = searchText;
return;
}
NSLog(@"Clear clicked");
}
これで私の問題は解決しました。
これは私のために働く
-(UITextField*)getUITexfieldInUISearchBar:(UIView*)aSearchBar{
UITextField *searchBarTextField;
for (UIView *subView in [aSearchBar subviews]){
if ([subView isKindOfClass:[UITextField class]])
{
searchBarTextField = (UITextField *)subView;
[searchBarTextField setDelegate:self];
break;
}else if ([subView isKindOfClass:[UIView class]]){
[self getUITexfieldInUISearchBar:subView];
}
}
return searchBarTextField;
}
そして、TextFields Delegateを使用できます
- (BOOL)textFieldShouldClear:(UITextField *)textField {
//Do something here...
}
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
if (searchText.length == 0) {
//clear button (x) on the search bar is cliecked, so clear the table
[self clearTable];
}
}
Swift 5.2、Xcode 11.4
これは私のために働いた。
if let searchTextField = self.categoriesSearchBar.value(forKey: "searchField") as? UITextField , let clearButton = searchTextField.value(forKey: "_clearButton")as? UIButton {
clearButton.addTarget(self, action: #selector(self.yourFunction), for: .touchUpInside)
}
self.mySearchBar.searchTextField.delegate = self
拡張myViewController:UISearchTextFieldDelegate {
func textFieldShouldClear(_ textField: UITextField) -> Bool {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
self.mySearchBar.searchTextField.resignFirstResponder()
}
return true
}
}
「UISearchBarDelegate」に準拠することで「キャンセルボタン」のクリックイベントに接続し、「searchBarCancelButtonClicked」メソッドを実装できます。
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String){
print("searchText: \(searchText)")
if searchText.count > 0
{
// Show ur content
}
else
{
// Hide your content
}
}
検索バーの十字ボタンを押すと、次のメソッドが呼び出されます。
func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool {
}
...うまくいく
if(searchText.length==0||searchText==nil){
[self.searchBar resignFirstResponder];
[NSTimer scheduledTimerWithTimeInterval:0.1
target:self
selector:@selector(hideKeyboard)
userInfo:nil
repeats:NO];
}
- (void)hideKeyboard{
[self.searchBar resignFirstResponder];
}