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