Скрыть текстовую кнопку UISearchBar

Я хотел бы знать, как скрыть или не отображать крест UISearchBar который появляется в textField для UISearchBar

Я пытался использовать это

filterSearchBar.showsCancelButton = NO;

Однако это настоящая кнопка отмены, а не маленький серый крестик, поэтому я хотел бы знать, есть ли эквивалент для маленькой серой кнопки, которая отображается в UISearchBar.

Ответ 1

Вам нужно получить textField строки поиска:

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

надеюсь, что эта помощь! =)

Ответ 2

Там лучший способ сделать это, и вам не нужно использовать частные API или перехватывать подзаголовки, чтобы это сделать, поэтому это решение является безопасным в App Store.

UISearchBar имеет встроенный API для этого:

[UISearchBar setImage: forSearchBarIcon: состояние]

Значок значка SearchBar, который вы хотите, - UISearchBarIconClear, и вы хотите состояние UIControlStateNormal. Затем дайте ему четкое изображение для изображения, и все готово.

Итак, это должно выглядеть так:

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

Ответ 3

Основываясь на ответе @Gines, вот версия Swift:

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

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

Ответ 4

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
    }
}

Ответ 5

Вы можете удалить текстовую кнопку для всех экземпляров UISearchBar:

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

Ответ 6

Swift 3, на основе ответа @Alexsander:

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

Ответ 7

Решение Swift 3:

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

Использование:

searchBar.textField.clearButtonMode = .never

Ответ 8

Я пробовал разные решения по этой проблеме, даже тот, который был выбран в этом сообщении, но они не работали.

Вот как я нашел решение этой проблемы:

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

Ответ 9

Попробуйте следующее:

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

}

Ответ 10

В случае 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;
            }
        }

Ответ 11

Swift 2.3, на основе ответа @Alexsander:

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

Ответ 12

Преобразование ответа Soto_iGhost в Swift 4:

func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {

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

Если у вас есть выход UISearchBar вы можете написать код выше в любом месте вашего класса.

Ответ 13

thijsonline ответ по-быстрому:

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