Как реализовать UISearchController в UITableView-Swift
Я новичок в Swift и я пытаюсь добавить функцию поиска на мой UITableView
который находится в UIViewController
класса. Я много гуглил и нашел это 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;
EDIT: Я пытаюсь назначить обновление результатов поиска в as
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
}
}
* однако на линейном контроллере.searchResultsUpdater = self я получаю eroor, так как не могу присвоить значение typ "ViewController" до значения типа"UISearchResultsUpdating?".. Поэтому я действительно сомневаюсь, что могу использовать UISearchController на UIViewController тип класса.
3 ответов
да, способ работы поиска был радикально изменен для того, что я считаю лучшей системой. Новая система намного лучше и прямо к месту для большинства простых реализаций. Использование его довольно просто.
во-первых, сделайте ваш класс соответствовать 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
}
и наконец, реализовать updateSearchResults:for
метод, который исходит из UISearchResultsUpdating
протокол:
func updateSearchResults(for searchController: UISearchController) {
}
ваша реализация этого метода будет, конечно, зависеть от того, где вы ищете данные. Он обновит ваше текущее представление таблицы с содержимым вашего поиска по мере их ввода. Убедитесь, что вы обновили источник данных и перезагрузили представление таблицы в updateSearchResultsForSearchController
метод. Опять же, он обновляется по мере ввода, поэтому убедитесь, что если ваши данные для поиска большие или если вы ищете из интернет, добавьте некоторый параллелизм в этот метод.
если вы хотите использовать другой контроллер для заполнения результатов поиска, вы можете передать этот VC при инициализации searchController
собственность.
редактировать: я перечитал ваш вопрос и, похоже, я забыл добавить кое-что важное.
UITableViewController имеет член с именем tableView
. Вы можете захватить представление таблицы контроллера, но заполнить свой UITableView
, вам не надо прикоснуться к нему. Вы не можете использовать логику SearchController напрямую С UITableView. Ты должен работать с контроллером, чтобы получить его. Используйте делегат UITableViewController и методы источника данных, чтобы обновить пользовательский интерфейс таблицы с результатами поиска.
пожалуйста, прочитайте с помощью UITableViewController, UITableViewDelegate и UITableViewDataSource, чтобы вы могли понять, как получить результаты поиска там.
в случае любой, кто бесится вокруг меня..этот код может помочь
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()
}
}
для тех, кто ищет немного больше контекста по всем аспектам реализации этого, вот учебник о том, как реализовать UISearchController
кроме приведенный выше ответ Энди Ибаньеса, вам также нужно добавить код к вашим методам UITableViewDataSource, чтобы показать новые отфильтрованные результаты в tableview.
кроме того, не забудьте позвонить tableView.reloadData()
в вашем методе updateSearchResults-UISearchController не делает автоматически скажите tableView перезагрузить свои данные.