web-dev-qa-db-ja.com

UISearchBarクリアテキストボタンを非表示

UISearchBartextFieldに表示されるUISearchBarクロスを非表示にする方法と表示しない方法を知りたいのですが。

これを使ってみました

filterSearchBar.showsCancelButton = NO;

ただし、これは実際のキャンセルボタンであり、小さな灰色の十字ではないため、UISearchBarに表示される小さな灰色のボタンに相当するものがあるかどうかを知りたいと思います。

14
HurkNburkS

検索バーのtextFieldを取得する必要があります。

UITextField *textField = [searchBar valueForKey:@"_searchField"];
textField.clearButtonMode = UITextFieldViewModeNever;

この助けを願っています! =)

35
Soto_iGhost

これを行うためのより良い方法があり、プライベートAPIを使用したり、サブビューをトラバースしたりする必要がないため、このソリューションはAppStoreで安全です。

UISearchBarには、これを行うための組み込みAPIがあります。

[UISearchBar setImage:forSearchBarIcon:state]

必要なSearchBarアイコンキーはUISearchBarIconClearであり、UIControlStateNormal状態が必要です。次に、画像の鮮明な画像を提供します。これで完了です。

したがって、次のようになります。

[searchBar setImage:clearImage forSearchBarIcon:UISearchBarIconClear state:UIControlStateNormal];
9
Alexander

@Ginesの回答に基づいて、ここにSwiftバージョン:

func searchBarTextDidBeginEditing(searchBar: UISearchBar) {
    guard let firstSubview = searchBar.subviews.first else { return }

    firstSubview.subviews.forEach {
        ($0 as? UITextField)?.clearButtonMode = .never
    }
}
7
kishorer747

Swift 4

アレクサンダーの答えに追加し、クリアボタンでユーザーの操作をブロックします。

ボタンを非表示にするには:

searchBar.setImage(UIImage(), for: .clear, state: .normal)

クリアボタンでのユーザー操作を無効にするには、UISearchBarをサブクラス化するだけです

class CustomSearchBar: UISearchBar {

    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
        let view = super.hitTest(point, with: event)
        if view is UIButton {
            return view?.superview // this will pass-through all touches that would've been sent to the button
        }
        return view
    }
}
6

すべてのUISearchBarインスタンスのクリアテキストボタンを削除できます。

[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]].clearButtonMode = UITextFieldViewModeNever;
4
thijsonline

@Alexsanderの回答に基づくSwift3:

searchBar.setImage(UIImage(), for: .clear, state: .normal)
3
oskarsprima

Swift 3ソリューション:

extension UISearchBar{
    var textField : UITextField{
        return self.value(forKey: "_searchField") as! UITextField
    }
}

使用法 :

searchBar.textField.clearButtonMode = .never
2
Maor

これを試して:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {
    UITextField *textField = [searchBar valueForKey:@"_searchField"];
    textField.clearButtonMode = UITextFieldViewModeNever;

}
1
Vahe Andreasyan

この投稿で選択したものも含めて、この問題についてさまざまな解決策を試しましたが、うまくいきませんでした。

これは私がこの問題を解決するために見つけた方法です:

UIView *subview = [[searchBar subviews] firstObject]; //SearchBar only have one subview (UIView)

//There are three sub subviews (UISearchBarBackground, UINavigationButton, UISearchBarTextField)
for (UIView *subsubview in subview.subviews)
{
    //The UISearchBarTextField class is a UITextField. We can't use UISearchBarTextField directly here.
    if ([subsubview isKindOfClass: [UITextField class]])
    {
            [(UITextField *)subsubview setClearButtonMode:UITextFieldViewModeNever];
    }
}
1
Ginés SM

スウィフト5

iOS 13でテスト済み

私のために働いている1つのライナー:

searchBar.searchTextField.clearButtonMode = .never

.whileEditingに設定して、ユーザーが入力しているときに表示し、検索バーがフォーカスを失ったときに削除することもできます。

@Alexsanderの回答に基づくSwift2.3:

searchBar.setImage(UIImage(named: "SearchClearIcon"), forSearchBarIcon: UISearchBarIcon.Clear, state: UIControlState.Highlighted)
searchBar.setImage(UIImage(named: "SearchClearIcon"), forSearchBarIcon: UISearchBarIcon.Clear, state: UIControlState.Normal)
0
Nemanja

thijsonlineの answer in Swift:

(UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self])).clearButtonMode = .never
0
Hemang

Soto_iGhostの answer をSwift 4:

func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {

    let textField: UITextField = searchBar.value(forKey: "_searchField") as! UITextField
    textField.clearButtonMode = .never
}

UISearchBarのアウトレットがある場合は、クラスのどこにでも上記のコードを記述できます。

0
user4886069

Swift 2.3の場合は次を使用してください:

var searchBar = UISearchBar();
searchBar.frame = CGRectMake(0, 0, 00, 20))
for subview: UIView in (searchBar.subviews.first?.subviews)!
        {
            if (subview.isKindOfClass(UITextField) )
            {
                let textFieldObject = (subview as! UITextField)
                textFieldObject.clearButtonMode = .Never;
            }
        }
0
Bijendra Singh