title: searchDisplayController, UITableView, Core Data and Swift
body: <p>Trying to search in the table with <code>searchDisplayController</code>. Data filtering configured, the search dialog works. Now I want to work with a method <code>prepareForSegue</code> for send current value <code>indexPath</code> to a new <code>UIViewController</code>:</p>
  
  <pre><code>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?) -&gt; Int {
      return 1
  }
  
  override func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -&gt; Int {
      if tableView == self.searchDisplayController.searchResultsTableView {
          return searchResults.count
      } else {
          return results.count
      }
  }
  
  override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath) -&gt; 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?) -&gt; 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!) -&gt; Bool {
      self.filterContentForSearchText (searchString)
      return true
  }
  </code></pre>
  
  <p>}</p>
  
  <p>In the functions <code>prepareForSegue</code> condition self.tableView == <code>self.searchDisplayController.searchResultsTableView</code> is not fulfilled. </p>
  
  <p>Always assigns <code>indexPath = self.tableView.indexPathForSelectedRow()</code> instead <code>indexPath = self.searchDisplayController.searchResultsTableView.indexPathForSelectedRow()</code>. This causes an error in case of selecting a row in the search result.</p>
  
  <p>Link to project on Dropbox: <a href="https://www.dropbox.com/s/bqv46nkoa4s3ibg/lesson-12-2-swift%203.zip" rel="nofollow">https://www.dropbox.com/s/bqv46nkoa4s3ibg/lesson-12-2-swift%203.zip</a></p>