UISearchController:如何在ios8中获取选定的表行索引(Swift)

时间:2015-08-04 06:43:35

标签: swift ios8 uisearchdisplaycontroller uisearchcontroller

我知道在ios8中不推荐使用searchDisplayController,我在使用UISearchController找到筛选结果中的选定行时遇到问题

我有以下情况:

     var myObject = PFObject(className:"XX")
     if segue.identifier == "XXXSegue" {
        if let destination = segue.destinationViewController as? XXXTableViewController {
            if (self.resultSearchController.active) {

                if let row = self.searchDisplayController?.searchResultsTableView.indexPathForSelectedRow()?.row {
                    myObject = self.searchResults[row]
                }
            }
            else {
                if let row = tableView.indexPathForSelectedRow()?.row {
                    myObject = self.objects![row] as! PFObject
                }
            }
           // I will be using myObject for other stuff here 
        }
    }

如何从UISearchController中找到所选行索引,即相当于:

self.searchDisplayController?.searchResultsTableView.indexPathForSelectedRow()?.row

使用UISearchController?

2 个答案:

答案 0 :(得分:2)

一种解决方案是将segue连接到Story Board中的目标视图控制器,作为手动“推送”来自TableViewController 的segue,而不是从表视图的原型中选择“push”segue细胞

然后,在 tableView:didSelectRowAtIndexPath 函数中,手动执行segue:

self.performSegueWithIdentifier("XXXSegue", sender: tableView)

将根据您的UISearchController是否处于活动状态,作为完整的未过滤表视图或简化的过滤表视图作为参数传递。

最后,在 prepareForSegue 函数中:

if segue.identifier == "XXXSegue" {
  let sender = sender as! UITableView
  let destController = segue.destinationViewController as! XXXTableViewController
  let indexPath = sender.indexPathForSelectedRow()!

  if self.resultSearchController.active {
    destController.objects = self.searchResults[indexPath.row] //filtered array
  } else {
    destController.objects = self.objects[indexPath.row] //full array
  }
}

**编辑:但是,为了更直接地回答你的问题,你可以试试这个:

if self.resultSearchController.active {
  let updater = self.resultSearchController.searchResultsUpdater as! UITableViewController
  let indexPath = updater.tableView.indexPathForSelectedRow()!
...
}

如果您在初始化UISearchController时设置了 resultSearchController.searchResultsUpdater = self ,则此方法有效。

答案 1 :(得分:0)

override func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) {

 if tableView == self.searchDisplayController.searchResultsTableView {
    self.performSegueWithIdentifier("XXXSegue", sender : self)
  }
}



override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject?)     
{
//perform your checks upon segue or custom objects 
var indexPath = NSIndexPath()
if self.searchDisplayController.active {
// index path from search table ... 

    indexPath = self.searchDisplayController.searchResultsTableView.indexPathForSelectedRow()

} else {
// index path from main table ...
 }    

}