Ich bin ein Neuling bei Swift und versuche, meiner UITableView
, die sich in einer UIViewController
-Klasse befindet, eine Suchfunktion hinzuzufügen. Ich habe viel gegoogelt und festgestellt, dass UISearchDisplayController
veraltet und durch UISearchController ersetzt wurde. Als ich nach Tutorials gesucht habe, habe ich keine speziell für UITableView
gefunden. Einige davon waren für die Implementierung in UITableViewController
gedacht. Also hier sind meine Fragen:
Können wir UISearchController
in eine UITableView
implementieren, die sich in einer UIViewController
-Klasse befindet? (Ich denke, wir können)
Wenn wir können, konvertieren Sie bitte diese Codezeile in Objective-C. Oder wenn es wirklich gute Tutorials gibt, lass es mich wissen.
@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;
BEARBEITEN: Ich versuche, den Suchergebnisaktualisierer in als zuzuweisen
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
}
}
* In der Zeile controller.searchResultsUpdater = self erhalte ich die Fehlermeldung "Kann keinen Wert vom Typ" ViewController "einem Wert vom Typ" UISearchResultsUpdating ? "Zuweisen. .. Also ich bezweifle wirklich, ob ich UISearchController in UIViewController Typenklasse verwenden kann.
Ja, die Art und Weise, wie die Suche funktioniert, hat sich radikal verändert, was ich für ein besseres System halte. Das neue System ist für die einfachsten Implementierungen viel besser und direkter Punkt. Die Verwendung ist ziemlich unkompliziert.
Stellen Sie zunächst sicher, dass Ihre Klasse das UISearchResultsUpdating
-Protokoll einhält.
class MyTableViewController: UITableViewController, UISearchResultsUpdating {}
Fügen Sie die Suchcontroller-Eigenschaft hinzu:
class MyTableViewController: UTableViewController, UISearchResultsUpdating {
let searchController = UISearchController(searchResultsController: nil)
}
Fügen Sie die Suchleiste in viewDidLoad hinzu:
override func viewDidLoad() {
super.viewDidLoad()
searchController.searchResultsUpdater = self
searchController.hidesNavigationBarDuringPresentation = false
searchController.dimsBackgroundDuringPresentation = false
searchController.searchBar.sizeToFit()
self.tableView.tableHeaderView = searchController.searchBar
}
Und schließlich implementieren Sie die updateSearchResults:for
-Methode, die vom UISearchResultsUpdating
-Protokoll stammt:
func updateSearchResults(for searchController: UISearchController) {
}
Ihre Implementierung dieser Methode hängt natürlich davon ab, von wo aus Sie die Daten durchsuchen. Ihre aktuelle Tabellenansicht wird bei der Eingabe mit dem Inhalt Ihrer Suche aktualisiert. Stellen Sie sicher, dass Sie Ihre Datenquelle aktualisieren und die Tabellensicht in der updateSearchResultsForSearchController
-Methode neu laden. Wieder wird es während der Eingabe aktualisiert. Stellen Sie also sicher, dass bei großen Datenmengen, die Sie durchsuchen möchten, oder wenn Sie aus dem Internet suchen, etwas Parallelität in dieser Methode hinzufügen.
Wenn Sie einen anderen Controller zum Auffüllen Ihrer Suchergebnisse verwenden möchten, können Sie diesen VC bei der Initialisierung der searchController
-Eigenschaft übergeben.
EDIT: Ich habe Ihre Frage noch einmal gelesen und es scheint, als hätte ich vergessen, etwas Wichtiges hinzuzufügen.
UITableViewController hat ein Mitglied namens tableView
. Sie können die Tabellenansicht des Controllers verwenden, aber um UITableView
zu füllen, müssen Sie sie nicht berühren. Sie können die SearchController-Logiknicht direktmit UITableView verwenden. Du musst mit dem Controller arbeiten, um ihn dorthin zu bringen. Verwenden Sie die UITableViewController-Delegaten- und Datenquellenmethoden, um Ihre Tabellen-Benutzeroberfläche mit Ihren Suchergebnissen zu aktualisieren.
Bitte lesen Sie weiter unter Verwendung von UITableViewController, UITableViewDelegate und UITableViewDataSource, damit Sie wissen, wie Sie Ihre Suchergebnisse dort erhalten.
Im Fall von jemandem, der sich wie ich herumfummelt, könnte dieser Code helfen
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()
}
}
Für alle, die etwas mehr Kontext zu allen Aspekten der Implementierung suchen, finden Sie hier ein Tutorial zur Implementierung von UISearchController
Zusätzlich zu der obigen Antwort von Andy Ibanez müssen Sie auch Ihren UITableViewDataSource-Methoden Code hinzufügen, um die neu gefilterten Ergebnisse in der Tabellenansicht anzuzeigen.
Vergessen Sie auch nicht, tableView.reloadData()
in Ihrer updateSearchResults-Methode aufzurufen - der UISearchController weist das tableView nicht automatisch an, seine Daten neu zu laden.