2016-08-08 55 views
0

Ich versuche, eine Suche zu implementieren, die ihre Ergebnisse zu einer Datenbank aufrufen. Es gelingt mir, die Datenbank in der Konsole zu drucken, aber nicht über die Suche darauf zuzugreifen. HierTyp 'NSPredate hat keine tiefgestellten Mitglieder'

ist der Code, den ich verwenden:

import UIKit 

class SearchTableViewController: UITableViewController, UISearchResultsUpdating { 

var searchPredicate = NSPredicate() 
var filteredAppleProducts = [String]() 
var resultSearchController = UISearchController!() 
var arrDataArticles: NSMutableArray! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.searchPredicate = NSPredicate(format: "SELF LIKE[c] %@", resultSearchController.searchBar.text!) 

    self.resultSearchController = UISearchController(searchResultsController: nil) 
    self.resultSearchController.searchResultsUpdater = self 

    self.resultSearchController.dimsBackgroundDuringPresentation = false 
    self.resultSearchController.searchBar.sizeToFit() 

    self.tableView.tableHeaderView = self.resultSearchController.searchBar 

    self.tableView.reloadData() 
    self.getAllArticles() 
} 

func getAllArticles() { 
    arrDataArticles = NSMutableArray() 
    arrDataArticles = ModelBD.getInstance().getAllArticles() 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

// MARK: - Table view data source 

override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    // #warning Incomplete implementation, return the number of sections 
    return 1 
} 

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

    if self.resultSearchController.active { 
     return self.filteredAppleProducts.count 
    } 
    else { 
     return 0 
    } 
} 

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as UITableViewCell? 

    if self.resultSearchController.active { 
     cell!.textLabel?.text = self.filteredAppleProducts[indexPath.row] 
    } 
    else { 
     cell!.textLabel?.text = self.searchPredicate[indexPath.row] as! String 
    } 

    return cell! 
} 

func updateSearchResultsForSearchController(searchController: UISearchController) { 
    self.filteredAppleProducts.removeAll(keepCapacity: false) 

    let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text!) 

    let array = (self.appleProducts as NSArray).filteredArrayUsingPredicate(searchPredicate) 

    self.filteredAppleProducts = array as! [String] 

    self.tableView.reloadData() 
} 


} 

Typ 'NSPredicate hat keine Index Mitglieder

Fehler auf den Linien erscheint

cell!.textLabel?.text = self.searchPredicate[indexPath.row] as! String 

und

let array = (self.appleProducts as NSArray).filteredArrayUsingPredicate(searchPredicate) 

Weiß jemand, wie man das repariert?

Vielen Dank im Voraus für Ihre Zeit.

+0

Sie sollten nicht Ihre ursprüngliche Antwort bearbeiten, da nun der Kontext der Antwort ist weg. – ff10

Antwort

0

Sie können ein Instanzelement in einer Konstanten wie diesem nicht verwenden. In Ihrem Prädikat nehmen Sie bereits die Existenz von resultSearchController an. Stattdessen könnten Sie das Prädikat in viewDidLoad() oder während der Klasseninitialisierung initialisieren.

z.B .:

var searchPredicate: NSPredicate? 

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.searchPredicate = NSPredicate(format: "SELF LIKE[c] %@", resultSearchController.searchBar.text!) 

[...] 
+0

Jetzt habe ich einen Fehler "Verwendung der unaufgelösten Kennung 'searchPredicate'" auf beiden Zellen! .textLabel? .text = self.searchPredicate [indexPath.row] as! String und lassen Sie Array = (Self.searchPredicate als NSArray) .FilteredArrayUsingPredicate (searchPredicate) Ich verstehe, warum, aber ich weiß nicht, wie Sie es beheben. – TheoF

+0

Dies ist ein anderes Problem. Sie versuchen, auf das Prädikat zuzugreifen, als wäre es ein Array, das offensichtlich nicht funktioniert. – ff10

+0

Können Sie Ihre Änderungen zu Ihrer ursprünglichen Frage hinzufügen? – ff10