0

我正在關注這個tutorial,我遇到了一些麻煩。 我正在實施搜索欄和顯示控制器來過濾結果。UISearchDisplayController錯誤 - Swift

下面是我得到的錯誤的圖像:

enter image description here

的主要錯誤是:

  1. UISearchDisplayController被廢棄
  2. 不能下標值類型爲[String]?

任何幫助,以解決這些問題將是有益的。

下面是我的代碼的其餘部分:

import UIKit 

    class TableViewController: UITableViewController, UISearchBarDelegate, UISearchDisplayDelegate { 

var candies = [Candy]() 
var filteredCandies = [Candy]() 
var resultSearchController = UISearchController() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Uncomment the following line to preserve selection between presentations 
    // self.clearsSelectionOnViewWillAppear = false 

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller. 
    // self.navigationItem.rightBarButtonItem = self.editButtonItem() 

    self.candies = [Candy(category:"Chocolate", name:"Chocolate Bar"), 
     Candy(category:"Chocolate", name:"chocolate chip"), 
     Candy(category:"Hard", name:"lollipop"), 
     Candy(category:"Hard", name:"candy cane"), 
     Candy(category:"Other", name:"caramel"), 
     Candy(category:"Chocolate", name:"chocolate chip")] 

    self.tableView.reloadData() 

} 

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

} 

func filterContentForSearchText(searchText: String, scope: String = "All"){ 

    self.filteredCandies = self.candies.filter({(candy: Candy) -> Bool in 

     let categoryMatch = (scope == "All") || (candy.category == scope) 
     let stringMatch = candy.name.rangeOfString(searchText) 
     return categoryMatch && (stringMatch != nil) 
    }) 
} 

func searchDisplayController(controller: UISearchDisplayController, shouldReloadTableForSearchString searchString: String?) -> Bool { 
    let scopes = self.searchDisplayController!.searchBar.scopeButtonTitles 
    let selectedScope = scopes[self.searchDisplayController!.searchBar.selectedScopeButtonIndex] as String 
    self.filterContentForSearchText(searchString, scope: selectedScope) 
    return true } 

func searchController(controller: UISearchController, shouldReloadTableForSearchScope searchOption: Int) -> Bool { 

    let scope = self.searchDisplayController!.searchBar.scopeButtonTitles 
    self.filterContentForSearchText(self.searchDisplayController!.searchBar.text!, scope: scope[searchOption]) 
    return true 
} 

// 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 { 
    // #warning Incomplete implementation, return the number of rows 
    if tableView == searchDisplayController!.searchResultsTableView { 
     return self.filteredCandies.count 
    } else { 

     return self.candies.count 
    } 
} 


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

    // Configure the cell... 
    //let candy = self.candies[indexPath.row] 

    var candy : Candy 

    if tableView == self.searchDisplayController!.searchResultsTableView { 
     candy = filteredCandies[indexPath.row] 
    }else { 
     candy = candies[indexPath.row] 
    } 
    cell.textLabel?.text = candy.name 

    return cell 
} 

回答

1
  1. UISearchDisplayController被廢棄

UISearchDisplayController在iOS的8棄用您可以使用UISearchController,它非常類似於UISearchDisplayController。例如,請查看本教程:http://www.jhof.me/simple-uisearchcontroller-implementation/

  1. 不能下標[String]類型的值嗎?

scopeButtonTitles返回可選值,所以scopes是可選的。可選的陣列必須下標前解開,力展開了這種方式:

let scope = self.searchDisplayController!.searchBar.scopeButtonTitles 
self.filterContentForSearchText(self.searchDisplayController!.searchBar.text!, scope: scope![searchOption]) 

或與任何其他可選檢查邏輯:

if let scope = scope {   
    self.filterContentForSearchText(self.searchDisplayController!.searchBar.text!, scope: scope[searchOption]) 
} else { 
// handle error 
} 
+0

完美!謝謝。 – Skywalker