过滤器UISearchController - Swift之后的didSelectRowAtIndexPath索引路径

时间:2015-04-24 19:00:58

标签: ios uitableview swift

我正在一个分段表中实现一个带有UISearchController的搜索栏。到目前为止一切都很好。

主要问题是,当过滤后的结果出现时,它是一个没有任何部分和更少行的全新表。

当选择行时,我对数组中的那个位置执行segue,但是详细视图期望来自主数组的精确行或索引,这是我无法从过滤的对象数组中获得的,这可能是在300个元素中为[0] [1] [2]。

我想我可以将所选对象与主数组进行比较并假设没有重复项,从那里获取索引并将其传递给...但这对我来说似乎效率很低。

Apple在联系人应用中过滤联系人时做了类似的事情(我很遗憾不知道如何)。他们如何通过联系对象?这几乎是我的目标。

我在这里告诉你我正在做的事情:

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

        if(self.resultSearchController.active) {
            customerAtIndex = indexPath.row // Issue here
            performSegueWithIdentifier("showCustomer", sender: nil)
        }
        else {
            customerAtIndex = returnPositionForThisIndexPath(indexPath, insideThisTable: tableView)
            performSegueWithIdentifier("showCustomer", sender: nil)
        }
    }

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "showCustomer" {
            if let destination = segue.destinationViewController as? CustomerDetailViewController {
                destination.newCustomer = false
                destination.customer = self.customerList[customerAtIndex!]
                destination.customerAtIndex = self.customerAtIndex!
                destination.customerList = self.customerList
            }
        }
    }

4 个答案:

答案 0 :(得分:6)

你可以用另一种方式做,这是一招,但它有效。首先更改您的didSelectRowAtIndexPath,如下所示:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        var object :AnyObject?
        if(self.resultSearchController.active) {
            object = filteredArray[indexPath.row]
        }
        else {
            object = self.customerList[indexPath.row]
        }

        performSegueWithIdentifier("showCustomer", sender: object)
    }

现在,在prepareForSegue中,取回对象并将其发送到详细的视图控制器

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "showCustomer" {
        if let destination = segue.destinationViewController as? CustomerDetailViewController {
            destination.newCustomer = false
            destination.customer = sender as! CustomerObject
            destination.customerAtIndex = self.customerList.indexOfObject(destination.customer)
            destination.customerList = self.customerList
        }
    }
}

答案 1 :(得分:1)

将新属性 ActivityController<SearchActivity> controller = ActivityController.of(SearchActivity.class); controller.create().start().resume().visible().get(); Bundle outState = new Bundle(); controller.pause().saveInstanceState(outState).stop(); controller = ActivityController.of(SearchActivity.class).create(outState).start().visible(); subject = controller.get(); // the create(Bundle) method was just called with the complete view hierarchy and fragment information 添加到表视图类,然后使用NSMutableArray *searchArray方法将所有搜索结果传递给此数组。之后,您将能够在-(void)filterContentForSearchText:scope:中获取所选对象self.searchArray[indexPath.row]

答案 2 :(得分:1)

这是我在代码中使用的技巧,我基本上从tableView数组加载filteredObjects,然后indexPath始终是正确的:

  var selectedObject: Object?

  private var searchController: UISearchController!
  private var allObjects: [Object]? {
    didSet {
      filteredObjects = allObjects
    }
  }
  private var filteredObjects: [Object]? {
    didSet {
      NSOperationQueue.mainQueue().addOperationWithBlock {
        self.tableView.reloadData()
      }
    }
  }

  override func viewDidLoad() {
    super.viewDidLoad()

    loadData { objects in
      self.allObjects = objects
    }
  }

  // MARK:- UITableView

  override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return filteredObjects?.count ?? 0
  }

  override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! UITableViewCell
    cell.textLabel?.text = filteredObjects?[indexPath.row].name
    return cell
  }

  override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    selectedObject = filteredObjects?[indexPath.row]
  }

  // MARK:- UISearchBarDelegate

  func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {

    if !searchText.isEmpty {
      filteredObjects = allObjects?.filter{ $0.name.lowercaseString.rangeOfString(searchText.lowercaseString) != nil }
    } else {
      filteredObjects = allObjects
    }

答案 3 :(得分:0)

我看到两个解决方案 - 1)为什么不在详细视图中查找过滤数组中的行或索引而不是主数组。我猜您只关心该行中想要详细使用的对象。 2)使数组中的每个对象具有唯一的id。通过segue传递唯一ID,并在主数组中为该id进行详细查看搜索(谓词)。