2016-08-08 14 views
0

私はその結果をデータベースに呼び出す検索を実装しようとしています。私は、コンソールでデータベースの印刷を取得することはできますが、検索でアクセスすることはできません。ここで タイプ 'NSPredicateにサブスクリプトメンバがありません'

は、私が使用するコードです:

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


} 

タイプ "NSPredicateが持つ無添字メンバーの

エラーがラインに表示されます

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

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

これを修正する方法は誰でも知っていますか?

お時間をいただきありがとうございます。

+0

今の答えのコンテキストがなくなっているので、あなたのオリジナルの答えを編集しないでください。 – ff10

答えて

0

インスタンスメンバーをこのような定数で使用することはできません。あなたの述語では、すでにresultSearchControllerの存在を仮定しています。代わりに、viewDidLoad()の述部を初期化することも、クラスの初期化中に行うこともできます。

例えば:

var searchPredicate: NSPredicate? 

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

[...] 
+0

これで、両方のセルで "未解決の識別子 'searchPredicate'を使用するとエラーが発生しました!.textLabel?.text = self.searchPredicate [indexPath.row] as!文字列 とlet array =(self.searchPredicate as NSArray).filteredArrayUsingPredicate(searchPredicate)私は理由を理解していますが、修正方法はわかりません。 – TheoF

+0

これは別の問題です。述語が配列であるかのようにアクセスしようとしていますが、これは明らかに機能しません。 – ff10

+0

元の質問に変更を追加できますか? – ff10

関連する問題