Swift:选择搜索结果后返回tableview

Posted

技术标签:

【中文标题】Swift:选择搜索结果后返回tableview【英文标题】:Swift: return to tableview after selecting a search result 【发布时间】:2015-04-01 13:38:20 【问题描述】:

我已经成功实现了一个搜索功能。我希望能够搜索我的列表,选择列表中的一个项目,然后在项目 保持 被选中时返回到主表视图。我该怎么做?

这是在搜索栏中没有任何选择或字符的表格视图。项目没有详细视图。项目确实有更多可以检索的信息,例如网址。当用户按下左上角的“邮件”按钮时,必须稍后检索此数据。

这是包含搜索结果的列表。单元格的灰色突出显示表示该单元格已被选中。我现在如何返回主表视图,同时保持选择?我只看到右上角的取消按钮、搜索栏顶部中间的十字按钮以及键盘右下角的“搜索”按钮。在存储选择时,没有人会带您回到主 tableview。

根据建议的答案,我能够使用以下函数存储行的索引路径:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath       indexPath: NSIndexPath) 
    let rowToSelect = indexPath
    println(rowToSelect)
    selectedCellTitle = selectedCell?.textLabel?.text ?? ""
    println("The stored cell is called \(selectedCellTitle)")

但是,我没有成功重新选择主表视图中的行。我的代码如下。看起来常量“rowToSelect”没有被转移到另一个函数(参见最后一行代码之前的那个)。我该如何解决?

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
         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

【问题讨论】:

当你放入视图时向你的单元格添加一个标签,当你选择单元格时存储标签,遍历你的表格视图的子视图测试标签是否是存储的标签,使选择正确的单元格 在这种方法中,用户将使用什么按钮从搜索结果列表转到完整列表? 我已经编辑了我的反应,我希望这能为你澄清一些事情 你解决过这个问题吗? 【参考方案1】:

UITableView 委托有一个函数tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath。 This function get’s called when a row is selected. 如果你监听这个函数并保存选择的 indexPath,你可以使用selectRowAtIndexPath 在你的主视图中(重新)选择它。

实现此函数以侦听 tableView 中所做的任何选择

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 
    //get back to your filled UITableView
    //Save "indexPath" to a variable

当您回到拥有 UITableView 的视图控制器时

self.tlbView.selectRowAtIndexPath(“above declared variable”, animated: true, scrollPosition: .Top)

【讨论】:

米洛,结果很有希望!我可以在搜索表视图中为所选行存储不同的值(例如,文本作为字符串,或 indexPath 作为 NSIndexPath)。但是,我还不能在主表视图中重新选择行。我认为这是因为我需要将“声明的变量”带到一个新函数中,这似乎不起作用。上例中的代码。你会如何解决这个问题? 您提供的代码很少(不准确:P),所以我需要猜测一下。当你回到你的表视图self.tlbView.selectRowAtIndexPath(selected, animated: true, scrollPosition: .Top)时,你可以在任何类var selected = o之外声明一个变量而不是selected = messageTableView.indexPathsForSelectedRows()?.first as! NSIndexPath 哈哈,码起来了!查看您的回复,我已将 rowToSelect 声明为 var rowToSelect = NSIndexPath(forRow: 0, inSection: 0) 在函数之外(但在 PublicationTableViewController 类中)。但是,一旦我在搜索视图中选择了一行,rowToSelect 的新值似乎并没有被继承。我想我误解了如何结转变量。 首先当你搜索tableview时,它会根据新创建的搜索tableview索引路径给出indexpath,而不是原来的tableview indexpath。 这不会像 Swayambhu 建议的那样工作。搜索到的行的索引路径不会和表格视图的原始索引路径相同。【参考方案2】:

如果您能够在 tableViewController 中保存 Cell 的索引,则可以在返回 tableView 后立即使用self.tableView.selectRowAtIndexPath(indexPath, animated: true, scrollPosition: .Top)。即使您滚动表格,这也会使单元格保持灰色,就像您的图片一样。

【讨论】:

在这种方法中,用户将使用什么按钮从搜索结果列表转到完整列表? 只要搜索栏为空,如果表格视图跳回正常状态(所有条目),他不需要额外的按钮。我会使用委托,然后绑定optional func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) 请参见此处:developer.apple.com/library/prerelease/ios/documentation/UIKit/…:

以上是关于Swift:选择搜索结果后返回tableview的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift4 中取消选中 TableView 所有 TableView 选择

Swift 多个子视图并返回到原始 TableView

swift中选择后UITableViewCell布局错误

选择一个 TableView Cell 后,将数据传回 Swift 中的前一个 View Controller

Swift 搜索栏 - 使用 Alamofire 请求更新表格视图

Swift 如何在从 API 接收数据后填充我的 tableView