如何在 UITableView 中实现 UISearchController - Swift
How to implement UISearchController in UITableView - Swift
我是 Swift 的新手,我正在尝试向我的 UITableView
添加搜索功能,它位于 UIViewController
class 中。我在谷歌上搜索了很多,发现 UISearchDisplayController
已被弃用并被 UISearchController 取代。当我尝试搜索教程时,我没有找到任何专门针对 UITableView
的教程。其中一些用于在 UITableViewController
中实施。所以这是我的问题:
我们能否在 UIViewController
class 中的 UITableView
中实现 UISearchController
? (我想我们可以)
如果可以,请将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;
Source
编辑:
我正在尝试在 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
}
}
*但是在 controller.searchResultsUpdater = self 行上我得到了 eroor 无法将典型值 "ViewController" 分配给类型“UISearchResultsUpdating 的值?” .. 所以我真的怀疑我是否可以在 UIViewController 类型 class. 中使用 UISearchController
是的,搜索的工作方式已经彻底改变,我认为这是一个更好的系统。对于大多数简单的实施,新系统要好得多,而且直截了当。使用它非常简单。
首先,让您的 class 遵守 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
}
最后,实现来自 UISearchResultsUpdating
协议的 updateSearchResults:for
方法:
func updateSearchResults(for searchController: UISearchController) {
}
您对此方法的实施当然取决于您从何处搜索数据。它会在您输入搜索内容时更新您当前的 table 视图。确保更新数据源并在 updateSearchResultsForSearchController
方法中重新加载 table 视图。同样,它会在您键入时更新,因此请确保如果您要搜索的数据很大或者您是从互联网上搜索,请在此方法中添加一些并发性。
如果您想使用不同的控制器来填充您的搜索结果,您可以在初始化 searchController
时传递 VC 属性。
编辑:我已经重读了你的问题,看起来我忘了添加一些重要的东西。
UITableViewController 有一个名为 tableView
的成员。您可以获取控制器的 table 视图,但要填充您的 UITableView
,您无需触摸它。您不能将 SearchController 逻辑 直接 与 UITableView 一起使用。你必须与控制器一起工作才能到达那里。使用 UITableViewController 委托和数据源方法让您的 table UI 更新您的搜索结果。
请继续阅读 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()
}
}
对于那些想了解有关实施此方案所有方面的更多背景信息的人,这里有 tutorial on how to implement UISearchController
除了之外,您还需要将代码添加到您的 UITableViewDataSource 方法中,以在表格视图中显示新过滤的结果。
此外,不要忘记在 updateSearchResults 方法中调用 tableView.reloadData()
- UISearchController 不会自动通知 tableView 重新加载其数据。
我是 Swift 的新手,我正在尝试向我的 UITableView
添加搜索功能,它位于 UIViewController
class 中。我在谷歌上搜索了很多,发现 UISearchDisplayController
已被弃用并被 UISearchController 取代。当我尝试搜索教程时,我没有找到任何专门针对 UITableView
的教程。其中一些用于在 UITableViewController
中实施。所以这是我的问题:
我们能否在
UIViewController
class 中的UITableView
中实现UISearchController
? (我想我们可以)如果可以,请将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;
Source
编辑: 我正在尝试在 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
}
}
*但是在 controller.searchResultsUpdater = self 行上我得到了 eroor 无法将典型值 "ViewController" 分配给类型“UISearchResultsUpdating 的值?” .. 所以我真的怀疑我是否可以在 UIViewController 类型 class. 中使用 UISearchController
是的,搜索的工作方式已经彻底改变,我认为这是一个更好的系统。对于大多数简单的实施,新系统要好得多,而且直截了当。使用它非常简单。
首先,让您的 class 遵守 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
}
最后,实现来自 UISearchResultsUpdating
协议的 updateSearchResults:for
方法:
func updateSearchResults(for searchController: UISearchController) {
}
您对此方法的实施当然取决于您从何处搜索数据。它会在您输入搜索内容时更新您当前的 table 视图。确保更新数据源并在 updateSearchResultsForSearchController
方法中重新加载 table 视图。同样,它会在您键入时更新,因此请确保如果您要搜索的数据很大或者您是从互联网上搜索,请在此方法中添加一些并发性。
如果您想使用不同的控制器来填充您的搜索结果,您可以在初始化 searchController
时传递 VC 属性。
编辑:我已经重读了你的问题,看起来我忘了添加一些重要的东西。
UITableViewController 有一个名为 tableView
的成员。您可以获取控制器的 table 视图,但要填充您的 UITableView
,您无需触摸它。您不能将 SearchController 逻辑 直接 与 UITableView 一起使用。你必须与控制器一起工作才能到达那里。使用 UITableViewController 委托和数据源方法让您的 table UI 更新您的搜索结果。
请继续阅读 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()
}
}
对于那些想了解有关实施此方案所有方面的更多背景信息的人,这里有 tutorial on how to implement UISearchController
除了
此外,不要忘记在 updateSearchResults 方法中调用 tableView.reloadData()
- UISearchController 不会自动通知 tableView 重新加载其数据。