我的应用程序的主tableview包含一个包含UISearchBar的列表。该应用程序允许用户选择多个列表条目,并通过电子邮件发送。
当用户在搜索栏中选择列表条目时,以下代码存储所选项目的信息:
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
// Code to store description of selected cell
let selectedCell = tableView.cellForRowAtIndexPath(indexPath)
println(selectedCell)
// Code to store indexPath of selected cell
rowToSelect = tableView.indexPathForSelectedRow()
println(rowToSelect)
// Code to store textLabel of selected cell
selectedCellTitle = selectedCell?.textLabel?.text ?? ""
println("The stored cell is called \(selectedCellTitle)")
}
然后,我使用以下代码在主表视图中重新选择搜索视图中的选定单元格:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = self.tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell
if tableView == self.searchDisplayController!.searchResultsTableView {
cell.textLabel?.text = filteredPublications[indexPath.row].valueForKey("fullTitle") as? String
cell.detailTextLabel?.text = filteredPublications[indexPath.row].valueForKey("journal") as? String
println(filteredPublications)
} else {
cell.textLabel?.text = publications[indexPath.row].valueForKey("fullTitle") as? String
cell.detailTextLabel?.text = publications[indexPath.row].valueForKey("journal") as? String
self.tableView.selectRowAtIndexPath(rowToSelect, animated: true, scrollPosition: .Top)
}
return cell
}
这不起作用,因为搜索视图中列表条目的indexPath不等于main tableView中相同条目的indexPath。从搜索视图返回后,如何在主tableView中选择相等的条目?
(一个建议是将textLabel存储在搜索视图中,就像上面代码中的selectedCellTitle一样。然后,我可以遍历主tableView中的所有单元格,找到与变量selectedCellTitle具有相同标题的单元格。然后,我可以存储该单元格的indexPath。然后,我可以重新选择单元格。但是,我不知道如何在所有单元格中编写循环,并过滤单元格标题等于selectedCellTitle的单元格。我的尝试在下面,但不起作用。)
for publication in publications {
if let fullTitle = publication.valueForKey("fullTitle") as? NSString {
if fullTitle.containsString(selectedCellTitle) {
var rowToSelectIndexPath = publication.indexPath
self.tableView.selectRowAtIndexPath(rowToSelectIndexPath)
}
}
}
答案 0 :(得分:0)
不是跟踪选定的indexPath,而是跟踪位于该indexPath的对象。然后,您可以确定该对象落在主publications
数组中的索引。然后,您可以在主表视图中构建正确的indexPath。
您没有指出publications
数组中保留的对象类,但出于参数的考虑,我们将其称为Publication
。然后,您需要声明一个用于跟踪所选出版物的属性:
var selectedPublication : Publication? = nil
然后,在didSelectRowAtIndexPath
中设置值:
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
if tableView == self.searchDisplayController!.searchResultsTableView {
selectedPublication = filteredPublications[indexPath.row]
} else {
selectedPublication = publications[indexPath.row]
}
}
然后,当你解雇searchController时:
if let selection = selectedPublication {
// use this if publications is an NSArray...
let selectedRow = publications.indexOfObject(selection)
// or this if publications is a Swift array...
let selectedRow = find(publications, selection)
if let row = selectedRow {
let selectedIndexPath = NSIndexPath(forRow:row, inSection:0)
self.tableView.selectRowAtIndexPath(selectedIndexPath)
}
}
(您放置此代码的位置取决于您实现searchController的方式 - 可能在viewWillAppear
中,或在searchController委托方法中)。
请注意,您不应该在selectRowAtIndexPath
内调用cellForRowIndexPath
- 每次显示新单元格时都会调用它,这可能会产生一些奇怪的动画效果。