我正在一个分段表中实现一个带有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
}
}
}
答案 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进行详细查看搜索(谓词)。