尝试使用searchDisplayController在表中搜索.配置数据过滤,搜索对话框有效.现在我想使用方法prepareForSegue将当前值indexPath发送到新的UIViewController:
- import UIKit
- import CoreData
- class MainTableViewController: UITableViewController {
- var results:AddrBook[]=[]
- var searchResults:AddrBook[]=[]
- init(style: UITableViewStyle) {
- super.init(style: style)
- }
- init(coder aDecoder: NSCoder!) {
- super.init(coder: aDecoder)
- }
- override func viewDidLoad() {
- super.viewDidLoad()
- }
- override func didReceiveMemoryWarning() {
- super.didReceiveMemoryWarning()
- }
- override func viewDidAppear(animated: Bool) {
- let request = NSFetchRequest(entityName: "Person")
- request.returnsObjectsAsFaults = false
- let appDelegate:AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
- let context:NSManagedObjectContext = appDelegate.managedObjectContext
- results = context.executeFetchRequest(request,error: nil) as AddrBook[]
- self.tableView.reloadData()
- }
- override func numberOfSectionsInTableView(tableView: UITableView?) -> Int {
- return 1
- }
- override func tableView(tableView: UITableView!,numberOfRowsInSection section: Int) -> Int {
- if tableView == self.searchDisplayController.searchResultsTableView {
- return searchResults.count
- } else {
- return results.count
- }
- }
- override func tableView(tableView: UITableView!,cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell! {
- var cell = tableView.dequeueReusableCellWithIdentifier("Cell") as? UITableViewCell
- if !cell {
- cell = UITableViewCell(style: UITableViewCellStyle.Value1,reuseIdentifier: "Cell")
- }
- if tableView == self.searchDisplayController.searchResultsTableView {
- cell!.textLabel.text = searchResults[indexPath.row].lastname + " " + searchResults[indexPath.row].firstname
- cell!.detailTextLabel.text = searchResults[indexPath.row].phonenumber
- } else {
- cell!.textLabel.text = results[indexPath.row].lastname + " " + results[indexPath.row].firstname
- cell!.detailTextLabel.text = results[indexPath.row].phonenumber
- }
- return cell
- }
- override func tableView(tableView: UITableView!,didSelectRowAtIndexPath indexPath: NSIndexPath!) {
- if tableView == self.searchDisplayController.searchResultsTableView {
- self.performSegueWithIdentifier("editPerson",sender : self)
- }
- }
- override func prepareForSegue(segue: UIStoryboardSegue!,sender: AnyObject?) {
- var indexPath = NSIndexPath()
- if self.tableView == self.searchDisplayController.searchResultsTableView {
- NSLog("Trying recieve indexPath from Search")
- indexPath = self.searchDisplayController.searchResultsTableView.indexPathForSelectedRow()
- NSLog("indexPath from Search")
- }
- else {
- indexPath = self.tableView.indexPathForSelectedRow()
- NSLog("IndexPath from main table")
- }
- let destViewController:DetailViewController! = segue.destinationViewController as DetailViewController
- if segue.identifier == "editPerson" {
- destViewController.receivedPerson = results
- destViewController.indexPath = indexPath
- NSLog("Selected person ID: \(results[indexPath.row].idperson)")
- }
- }
- override func tableView(tableView: UITableView?,canEditRowAtIndexPath indexPath: NSIndexPath?) -> Bool {
- return true
- }
- override func tableView(tableView: UITableView!,commitEditingStyle editingStyle: UITableViewCellEditingStyle,forRowAtIndexPath indexPath: NSIndexPath!) {
- let request = NSFetchRequest(entityName: "Person")
- request.returnsObjectsAsFaults = false
- let appDelegate:AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
- let context:NSManagedObjectContext = appDelegate.managedObjectContext
- if editingStyle == .Delete {
- context.deleteObject(results[indexPath.row])
- context.save(nil)
- }
- results.removeAtIndex(indexPath.row)
- tableView.deleteRowsAtIndexPaths([indexPath],withRowAnimation: .Fade)
- }
- func filterContentForSearchText (searchText: String) {
- searchResults = results.filter{
- ($0.lastname as NSString).localizedCaseInsensitiveContainsString("\(searchText)")
- }
- }
- func searchDisplayController(controller: UISearchDisplayController!,shouldReloadTableForSearchString searchString: String!) -> Bool {
- self.filterContentForSearchText (searchString)
- return true
- }
}
在函数prepareForSegue条件中,self.tableView == self.searchDisplayController.searchResultsTableView未实现.
始终指定indexPath = self.tableView.indexPathForSelectedRow()而不是indexPath = self.searchDisplayController.searchResultsTableView.indexPathForSelectedRow().如果在搜索结果中选择行,则会导致错误.
链接到DropBox上的项目:https://www.dropbox.com/s/bqv46nkoa4s3ibg/lesson-12-2-swift%203.zip
self.tableView是主表视图,所以条件
- if self.tableView == self.searchDisplayController.searchResultsTableView
永远不会是真的.但您可以检查搜索是否有效:
- if self.searchDisplayController.active {
- // index path from search table ...
- } else {
- // index path from main table ...
- }