web-dev-qa-db-ja.com

UISearchBar xボタンが押されました

「x」ボタンを押したときにイベントをどのように処理しますか?

私はこの方法を試しますが、うまくいきません。

-(void)searchBarCancelButtonClicked:(UISearchBar *)searchBar{

}

enter image description here

23
Fabio

Xボタンに接続する簡単な方法はないと思います。

ただし、その直接的な結果、つまりクリアテキストにフックできます。

これを試して:

func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
    if searchText == "" {
        print("UISearchBar.text cleared!")
    }
}

副作用として、手動でテキストをクリアしたときにも呼び出されます。

28
Eric Johnson

それを行うにはかなりハッキーな方法ですが、これは機能します。

_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が呼び出されないという事実にかかっています。代わりに、キーボードの削除ボタンがタップされると、メソッドが呼び出されます。

12
funct7

Swift 5.0の最も簡単なソリューション

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    if searchText.isEmpty {
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
            searchBar.resignFirstResponder()
        }
    }
}
4
Dejan

私は同じ問題を抱えていて、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");
}

これで私の問題は解決しました。

3
Eray Diler

これは私のために働く

-(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...
}
2
Dj tropycool
- (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];
    }
}
2
Mona

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)
}
1
Kedar Sukerkar

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
}

}

0
Mohan

「UISearchBarDelegate」に準拠することで「キャンセルボタン」のクリックイベントに接続し、「searchBarCancelButtonClicked」メソッドを実装できます。

0
Vrutin Rathod
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String){
    print("searchText: \(searchText)")
    if searchText.count > 0
    {
        // Show ur content
    }
    else
    {
        // Hide your content
    }
}
0
S R Nayak

検索バーの十字ボタンを押すと、次のメソッドが呼び出されます。

func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool {
}
0
Karanveer Singh

...うまくいく

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];
}
0
javipagan