[英]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.