2016-01-27 2 views
8

Я хочу добавить кнопку «фильтр» или «сортировать» рядом с searchBar внутри UISearchController. Я уже пытался добавить UIButton и searchbar в UIView и установить это как мой UITableView tableView.tableHeaderView. Это не работает, потому что tableView.tableHeaderView get возвращается к UISearchBar только при отклонении контроллера. Вот пример того, как я хочу это посмотреть: enter image description hereДобавить кнопку фильтра для UISearchController

+0

есть конкретная причина, вы используете поисковую контроллер? вы не можете использовать его и напрямую фильтровать представление таблицы? – Wain

+0

Причина чисто оптическая. Так что мне было бы хорошо с чем-нибудь – smnk

+0

. Я должен быть более конкретным, у вас уже есть табличный вид, вы счастливы просто отфильтровать его или используете совершенно другое представление, чтобы представить результаты поиска/хотите, чтобы функция наложения контроллера поиска? – Wain

ответ

0

Я бы потерял контроллер поиска, он не предлагает никаких функций, которые вы действительно хотите, а дополнительный вид/VC, который вам нужно предоставить, добавляет сложность/код дублирования.

В существующем виде таблиц уже есть все, что вам нужно, поскольку оно имеет источник данных. Это либо массив, либо FRC. Если это массив, вы можете заменить содержимое массива на ваше отфильтрованное содержимое, и если это FRC, вы можете изменить предикат.

Примечание: в массиве имеется 2 ссылки на массивы, 1 указывает на массив, содержащий все ваши нефильтрованные элементы, а другой, который первоначально является ссылкой на тот же массив, - вторая ссылка используется для заполнения табличного представления. Затем, когда вы фильтруете, вы создаете новый массив только с фильтрованными элементами и указываете на него вторую ссылку.

Вместо реализации метода делегирования контроллера поиска вы применяете методы делегирования панели поиска и используете это для запуска фильтрации и сброса.

Теперь вы избавились от контроллера поиска, вы также не переключаете представления таблиц, поэтому у вас есть только 1 ТВ и 1 вид заголовка. Теперь нет причин менять вид заголовка, и все просто работает.

+0

Я не понимаю, что я понял. Я не хочу знать, как фильтровать tableView, а как управлять кнопкой фильтра рядом с панелью поиска (в идеале в Search Controller) – smnk

+1

Вот почему я спросил о потере контроллера поиска. Проблема заключается в том, что контроллер поиска представляет другое представление, поэтому заголовок настроен по-разному. Вы должны просто настроить другой заголовок на другом представлении. Я считаю, что поисковые контроллеры просто добавляют сложность для небольшой реальной выгоды. Если у вас только 1 вид, у вас есть 1 заголовок, который прост в настройке и управление фокусом тоже просто. – Wain

3

Я пытался много, как это настроить SearchBar, но ничего не помогло мне наконец нашел способ полного заполнения Вашего требования

let mysearchController = UISearchController(searchResultsController: nil) 
    mysearchController.searchBar.showsCancelButton = true 
    mysearchController.searchBar.barStyle = UIBarStyle.Black 
    for var subView1 in mysearchController.searchBar.subviews{ 
     for var subView2 in subView1.subviews{ 
      if subView2 .isKindOfClass(UIButton){ 
       let customizedCancelButton:UIButton = subView2 as! UIButton 
       customizedCancelButton.enabled = true 
       customizedCancelButton.setTitle("", forState: UIControlState.Normal) 
       let image1 = UIImage(named: "Sort") 
       customizedCancelButton.setBackgroundImage(image1, forState: UIControlState.Normal) 
       customizedCancelButton.addTarget(self, action: "sort", forControlEvents: UIControlEvents.TouchUpInside) 
      } 
     } 
    } 

выше кода очень прост для понимания.

func sort(){ 
     print("sort button fired!!!") 
    } 

enter image description here

4

Вместо настройки UISearchBar и усложнять, вы можете сохранить его простым, добавив собственную кнопку рядом SearchBar.

комплект Нет в Показывает кнопку отмены вариант для SearchBar с помощью

self.searchBar.showsCancelButton = true 

ИЛИ

Снять отметку Показывает кнопку отмены вариант для SearchBar в раскадровке

enter image description here

Добавить свой собственная кнопка b eside SearchBar, как показано ниже

enter image description here

И затем, соответственно, добавить IBAction к кнопке и выполнить свои действия в нем.

Также в идеальном случае не рекомендуется размещать это представление в заголовке таблицы. Будет лучше, если он находится выше таблицы, а затем Apple.

enter image description here

3

я мог бы создать фильтр поиска с помощью нескольких строк кода. Я надеюсь, что это помогает.

* Я выбрал кнопку закладки, чтобы применить значок фильтра; потому что я уже использовал кнопку отмены для пользовательских действий.

Во-первых, у вас есть делегат searchBar для обработки нажатия кнопки click. Затем вы должны установить свойства, как показано ниже. Если вы хотите указать пользовательскую позицию (позиция по умолчанию - правая), вам нужно установить настройку настройки.

searchController.searchBar.delegate = self 
searchController.searchBar.showsBookmarkButton = true 
searchController.searchBar.setImage(UIImage(named: "Sort.png"), for: .bookmark, state: .normal) 
// MARK: You may change position of bookmark button. 
//searchController.searchBar.setPositionAdjustment(UIOffset(horizontal: 0, vertical: 0), for: .bookmark) 

Затем, переопределить поискBarBookmarkButtonClicked функция внутри вашего VC. Вы можете обработать событие click внутри этого метода.

func searchBarBookmarkButtonClicked(_ searchBar: UISearchBar) { //showAlert, presentVC or whatever you want here }

Кроме того, если вы хотите скрыть кнопку закладки во время поиска контроллер активен, необходимо применять контроль внутри метода updateSearchResults.

if searchController.isActive { 
    searchController.searchBar.showsBookmarkButton = false 
} else { 
    searchController.searchBar.showsBookmarkButton = true 
} 

While searchController is not active

searchController is active

+0

Отличное решение! Благодарю. – Alessign

Смежные вопросы