it-swarm.com.de

So implementieren Sie UISearchController in UITableView - Swift

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:

  1. Können wir UISearchController in eine UITableView implementieren, die sich in einer UIViewController-Klasse befindet? (Ich denke, wir können)

  2. 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;
    

Quelle

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.

38
user4790024

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.

67
Andy Ibanez

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()

    }
}
19
user4790024

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.

0
Bdebeez