尝试使用进行表格搜索searchDisplayController。配置了数据过滤后,搜索对话框将起作用。现在,我想使用一种prepareForSegue将当前值发送indexPath到新方法UIViewController:
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不满足。
self.searchDisplayController.searchResultsTableView
始终分配indexPath = self.tableView.indexPathForSelectedRow()代替indexPath = self.searchDisplayController.searchResultsTableView.indexPathForSelectedRow()。如果在搜索结果中选择一行,则会导致错误。
indexPath = self.tableView.indexPathForSelectedRow()
indexPath = self.searchDisplayController.searchResultsTableView.indexPathForSelectedRow()
链接到Dropbox上的项目:https : //www.dropbox.com/s/bqv46nkoa4s3ibg/lesson-12-2-swift%203.zip
self.tableView 是主表格视图,因此条件
self.tableView
if self.tableView == self.searchDisplayController.searchResultsTableView
永远不会是真的。但是您可以检查搜索是否处于活动状态:
if self.searchDisplayController.active { // index path from search table ... } else { // index path from main table ... }