Панель поиска — кнопка «Отмена» на панели навигации

Я делаю панель поиска в панели навигации. Когда я редактирую, у меня нет кнопки «Отмена» в правой части панели навигации.

Пытался:

func searchBarTextDidBeginEditing(searchBar: UISearchBar) {

    var barButton = UIBarButtonItem(title: "Cancel", style: UIBarButtonItemStyle.Done, target: self, action: "")
    self.navigationItem.rightBarButtonItem = barButton
}

введите здесь описание изображения

введите здесь описание изображения

РЕДАКТИРОВАТЬ:

Я добавил панель поиска в панель навигации следующим образом:

lazy var searchBar:UISearchBar = UISearchBar(frame: CGRectMake(0, 0, 300, 20))

        searchBar.placeholder = "Hľadať"
        searchBar.barStyle = UIBarStyle.BlackTranslucent
        var leftNavBarButton = UIBarButtonItem(customView:searchBar)
        self.navigationItem.leftBarButtonItem = leftNavBarButton

person patrikbelis    schedule 15.08.2015    source источник
comment
Я почти уверен, что кнопка отмены является своего рода опцией по умолчанию, поскольку в UISearchBar есть опция, которая явно определяет showCancelButton, поэтому я не знаю, нужно ли вам размещать там свою собственную кнопку отмены.   -  person Larry Pickles    schedule 15.08.2015
comment
Я добавил панель поиска программно, потому что хочу, чтобы она была на панели навигации.   -  person patrikbelis    schedule 15.08.2015
comment
Ясно, тогда позвольте мне конкретизировать другой вариант для вас   -  person Larry Pickles    schedule 15.08.2015
comment
@patffo Попытка установить showsCancelButton панели поиска на true.   -  person Bannings    schedule 15.08.2015
comment
Вы можете сделать это, но тогда всегда будет отображаться кнопка «Отмена».   -  person Darko    schedule 15.08.2015


Ответы (2)


Сделайте это таким образом:

func searchBarShouldBeginEditing(searchBar: UISearchBar) -> Bool {
    var cancelSearchBarButtonItem = UIBarButtonItem(title: "Cancel", style: UIBarButtonItemStyle.Plain, target: self, action: "cancelBarButtonItemClicked")
    self.navigationItem.setRightBarButtonItem(cancelSearchBarButtonItem, animated: true)
    return true
}

И в обработчике «Отмена»:

func searchBarCancelButtonClicked(searchBar: UISearchBar) {
    // closes the keyboard
    searchBar.resignFirstResponder()

    // If you are using a search controller
    // self.searchDisplayControllerCustom.setActive(false, animated: true)

    // remove the cancel button
    self.navigationItem.setRightBarButtonItem(nil, animated: true)
}

func cancelBarButtonItemClicked() {
    self.searchBarCancelButtonClicked(self.searchBar)
}

И установите правильный цвет для текста заголовка панели навигации:

// This sets the textcolor for all navigation bars in the app
// Do this in the app delegate on startup
UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName : UIColor.whiteColor()]

И добавьте делегата:

searchBar.delegate = self
person Darko    schedule 15.08.2015
comment
Пожалуйста, увеличьте текст «Отмена», например «Отмена ААААААА», чтобы проверить, увеличивается ли пробел справа. Возможно, просто выбран неправильный цвет. - person Darko; 15.08.2015
comment
Я обновил свой ответ цветом. Как вы установили панель поиска в панель навигации? - person Darko; 15.08.2015
comment
Попробуйте установить строку поиска по центру: self.navigationItem.titleView = searchBar - person Darko; 15.08.2015
comment
Действительно ли вызывается searchBarShouldBeginEditing? Вы настроили делегатов? Пожалуйста, отладьте. - person Darko; 15.08.2015
comment
Ну тогда: searchBar.delegate = self - person Darko; 15.08.2015
comment
большой! кстати. Вы знаете, как я могу поместить заполнитель слева? - person patrikbelis; 15.08.2015
comment
Что за заполнитель? - person Darko; 15.08.2015
comment
в панели поиска.. Кстати.. Когда я нажимаю «Отмена», выдает ошибку «Неопознанный селектор, отправленный в экземпляр 0x15750dd60» - person patrikbelis; 15.08.2015
comment
searchBar.placeholder = текст - person Darko; 15.08.2015
comment
Позаботьтесь о том, чтобы добавить двойную точку к селектору. отменаBarButtonItemClicked: - person Darko; 15.08.2015
comment
Да, я знаю. Но я имею в виду выравнивание.. Потому что теперь оно у меня посередине.. Я хочу с левой стороны. - person patrikbelis; 15.08.2015
comment
Нет, вы не можете изменить это. - person Darko; 15.08.2015
comment
Ой. Хорошо. И с этим действием: cancelBarButtonItemClicked? Это не работает. Получение ошибки. проверьте мой комментарий здесь. - person patrikbelis; 15.08.2015
comment
Я обновил свой ответ и добавил отсутствующую функцию cancelBarButtonItemClicked(). В этом случае двойная точка в конце селектора не нужна, потому что CancelBarButtonItemClicked не принимает никаких параметров. - person Darko; 15.08.2015
comment
Спасибо за помощь! Хорошего дня! - person patrikbelis; 15.08.2015

Если это ответ Objective-C:

- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar
{
    [searchBar setShowsCancelButton:YES];
}

Тогда это может быть ответ Swift: (не уверен на 100%)

func searchBarTextDidBeginEditing(searchBar: UISearchBar) {
    searchBar.showsCancelButton = true
}

Не забудьте связать своего делегата с self.

Источник: Справочник по классу UISearchBar

person emotality    schedule 15.08.2015