繁体   English   中英

将信息从tableview传递给视图控制器而不是基于indexPathForSelectedRow,而是传递给选定单元格的标签文本?

[英]Pass information from a tableview to a view controller based not on indexPathForSelectedRow, but on label text of cell selected?

我在UIViewController里面有一个tableview ,在Main.storyboard ,我从第一个视图控制器中tableview上的原型单元到第二个视图控制器有一个show segue。 我有这个代码:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showTheSeriesPage"
    {
        let indexPath : NSIndexPath = self.theTableAyy.indexPathForSelectedRow! as NSIndexPath
        var destViewController = segue.destination as! SeriesPageViewController
        var randomTemporaryArray = dataAry[indexPath.row]

        destViewController.sampleTitle = randomTemporaryArray.objectSeriesTitle
        destViewController.sampleAuthor = randomTemporaryArray.objectSeriesAuthor
    // Get the new view controller using segue.destinationViewController.
    // Pass the selected object to the new view controller.
}

它可以工作,但只有当tableview按特定顺序并且基于indexPath.row ,而不是基于单元本身的特定细节。 如何设置它以使其不依赖于所选的indexPath.row ,但可能是单元格的标签文本? 谢谢!

简短的回答:不要这样做。 您当前的方法是正确的。 您应该有一个包含表视图中显示的信息的数据模型。 当用户点击一个单元格时,您应该使用所选单元格的indexPath来查找模型中的条目,然后获取适合该条目的任何字符串。

单元格是视图对象,您不应使用它们来存储信息。

我理解这个问题,因为当您将TableView与搜索按钮链接时,这很常见。 特别是,如果您有一个链接到表格结果的搜索栏,则会动态更改。

我看了很多使用prepareForSegue函数的帖子,但我想使用prepare函数来切换到你的下一个视图。 就我而言,拥有一个更受控制的代码区域,可以从单个包含的函数中发送segue。

我的解决方案:1。我必须在视图控制器中声明2个变量来存储过滤结果(表视图中的动态新列表)和所选行。 例如,如果我们处理汽车清单,那么,

var filteredCars = [Car]()
var selectedCar: AnyObject!

然后在searchBar函数中:

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

    filteredCars = self.cars.filter({ (x: Car) -> Bool in

        return x.name?.lowercased().range(of: searchText.lowercased()) != nil

    })

    self.tbvOriginalTable.reloadData()
    // IMPORTANT store the new filtered table results to use them later
    saveFilteredTable = self.tbvOriginalTable

}

现在在准备功能:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    if segue.identifier == "optionlist" {

        let controller = segue.destination as! MealListTableViewController
        // this is the declared @IBOutlet weak var searchCar: UISearchBar!
        if searchCar.text != "" {
controller.car = filteredCars[(saveFilteredTable.indexPathForSelectedRow?.row)!]

        } else {
            controller.car = cars[(tbvOriginalTable.indexPathForSelectedRow?.row)!]
        }
    }
}
// We have to use the controller to assign an object of type car on the other side of the segue to receive the passed record

这真的为我做了伎俩,它花了我一些阅读和研究,最后完成它而不需要使用func tableView(_ tableView:UITableView,didSelectRowAt indexPath:IndexPath)加上prepareForSegue函数或任何其他类型的长编码

我希望这对许多人也有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM