Как реализовать UISearchController в UITableView - Swift
Я новичок в Swift, и я пытаюсь добавить функциональность поиска к моему UITableView
, который находится в классе UIViewController
. Я много искал в googled и обнаружил, что UISearchDisplayController
устарел и заменен на UISearchController. Когда я попытался найти учебники, я специально не нашел для UITableView
. Некоторые из них были реализованы в UITableViewController
. Итак, вот мои вопросы:
-
Можем ли мы реализовать UISearchController
в UITableView
, который находится в классе UIViewController
? (Я думаю, мы можем)
-
Если мы сможем, пожалуйста, конвертируйте эти строки кодов, написанных в Objective-C. Или, если есть действительно хорошие учебники, пожалуйста, дайте мне знать.
@property (strong, nonatomic) UISearchController *searchController;
UITableViewController *searchResultsController = [[UITableViewController alloc] init];
// Init UISearchController with the search results controller
self.searchController = [[UISearchController alloc] initWithSearchResultsController:searchResultsController];
// Link the search controller
self.searchController.searchResultsUpdater = self;
Источник
РЕДАКТИРОВАТЬ:
Я пытаюсь назначить обновление результатов поиска в виде
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, UISearchResultsUpdating {
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.blackColor()
self.addTableViewWithSection()
self.searchResultsController = UITableViewController()
var controller = UISearchController(searchResultsController: nil)
controller.searchResultsUpdater = self
controller.dimsBackgroundDuringPresentation = false
}
}
* Однако на строке controller.searchResultsUpdater = self я получаю eroor как нельзя присвоить значение типа "ViewController" для значения типа " UISearchResultsUpdating?".. Поэтому я действительно сомневаюсь, могу ли я использовать UISearchController в классе UIViewController.
Ответы
Ответ 1
Да, поиск результатов поиска был радикально изменен для того, что я считаю лучшей системой. Новая система намного лучше и прямолинейна для большинства простых реализаций. Использование этого довольно просто.
Сначала сделайте свой класс совместимым с протоколом UISearchResultsUpdating
.
class MyTableViewController: UITableViewController, UISearchResultsUpdating {}
Добавьте его свойство контроллера поиска:
class MyTableViewController: UTableViewController, UISearchResultsUpdating {
let searchController = UISearchController(searchResultsController: nil)
}
Добавить панель поиска в viewDidLoad:
override func viewDidLoad() {
super.viewDidLoad()
searchController.searchResultsUpdater = self
searchController.hidesNavigationBarDuringPresentation = false
searchController.dimsBackgroundDuringPresentation = false
searchController.searchBar.sizeToFit()
self.tableView.tableHeaderView = searchController.searchBar
}
И, наконец, реализуем метод updateSearchResultsForSearchController
, который поступает из протокола UISearchResultsUpdating
:
func updateSearchResultsForSearchController(searchController: UISearchController) {
}
Ваша реализация этого метода, конечно, будет зависеть от того, где вы ищете данные. Он обновит текущее представление таблицы с содержимым вашего поиска по мере ввода их. Убедитесь, что вы обновили источник данных и перезагрузили представление таблицы в методе updateSearchResultsForSearchController
. Опять же, он обновляется по мере ввода, поэтому убедитесь, что если ваши данные для поиска в большом или если вы ищете в Интернете, добавьте в этот метод concurrency.
Если вы хотите использовать другой контроллер для заполнения результатов поиска, вы можете передать этот VC при инициализации свойства searchController
.
EDIT. Я перечитал ваш вопрос, и похоже, я забыл добавить что-то важное.
UITableViewController имеет член под названием tableView
. Вы можете захватить представление таблицы контроллера, но чтобы заполнить ваш UITableView
, вам не нужно прикасаться к нему. Вы не можете использовать логику SearchController напрямую с помощью UITableView. Вы должны работать с контроллером, чтобы получить его там. Используйте делегат UITableViewController и методы источника данных, чтобы обновить ваш пользовательский интерфейс таблицы с результатами поиска.
Прочтите, используя UITableViewController, UITableViewDelegate и UITableViewDataSource, чтобы вы могли понять, как получить результаты поиска.
Ответ 2
В случае кого-то, кто волнуется, как я, этот код может помочь
class ViewController: UIViewController , UITableViewDataSource, UITableViewDelegate,UISearchResultsUpdating {
@IBOutlet weak var tblView: UITableView!
var tabledata = ["lucques","chickendijon","godaddy","amazon","chris","ambata","bankofamerica","abelcine","AUTO + TRANSPORTATION","BILLS + UTILITIES","FOOD + DINING","HEALTH","AutoCare", "Auto Payment" , "Gas+Fuel","Electric Bill", "Internet/Television","Fast Foodd", "Gorceries" , "Restaurants","Gym Membership", "Health Insurance","auto","note-bullet","knife","heart"]
var filteredTableData = [String]()
var resultSearchController = UISearchController()
override func viewDidLoad() {
super.viewDidLoad()
tblView.delegate = self
tblView.dataSource = self
self.resultSearchController = ({
let controller = UISearchController(searchResultsController: nil)
controller.searchResultsUpdater = self
controller.dimsBackgroundDuringPresentation = false
controller.searchBar.sizeToFit()
controller.searchBar.barStyle = UIBarStyle.Black
controller.searchBar.barTintColor = UIColor.whiteColor()
controller.searchBar.backgroundColor = UIColor.clearColor()
self.tblView.tableHeaderView = controller.searchBar
return controller
})()
self.tblView.reloadData()
}
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if self.resultSearchController.active {
return self.filteredTableData.count
}else{
return self.tabledata.count
}
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var section = indexPath.section
var row = indexPath.row
let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier:"addCategoryCell")
cell.selectionStyle = UITableViewCellSelectionStyle.None
cell.backgroundColor = UIColor.clearColor()
cell.contentView.backgroundColor = UIColor.clearColor()
cell.textLabel?.textAlignment = NSTextAlignment.Left
cell.textLabel?.textColor = UIColor.blackColor()
cell.textLabel?.font = UIFont.systemFontOfSize(14.0)
if self.resultSearchController.active {
cell.textLabel?.text = filteredTableData[indexPath.row]
} else {
cell.textLabel?.text = tabledata[indexPath.row]
}
return cell
}
func updateSearchResultsForSearchController(searchController: UISearchController) {
filteredTableData.removeAll(keepCapacity: false)
let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text)
let array = (tabledata as NSArray).filteredArrayUsingPredicate(searchPredicate)
filteredTableData = array as! [String]
self.tblView.reloadData()
}
}
Ответ 3
Для тех, кто ищет немного больше контекста во всех аспектах его реализации, здесь учебник о том, как реализовать UISearchController
В дополнение к приведенному выше вопросу от Andy Ibanez вам также необходимо добавить код к вашим методам UITableViewDataSource, чтобы отображать вновь отфильтрованные результаты в представлении таблицы.
Кроме того, не забудьте вызвать tableView.reloadData()
в вашем методе updateSearchResults - UISearchController автоматически не сообщает tableView для перезагрузки своих данных.