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

时间:2017-04-05 16:22:05

标签: ios swift xcode uitableview swift3

我在tableview内有一个UIViewController,在Main.storyboard上,我在show上的原型单元格中有一个tableview 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,但可能是单元格的标签文本?谢谢!

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

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

我看到许多帖子使用 prepareForSegue函数,但我想使用准备功能来转到与您一样的下一个视图。就我而言,拥有一个更受控制的代码区域,可以从单个包含的函数中发送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函数或任何其他类型的长编码

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