我在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
,但可能是单元格的标签文本?谢谢!
答案 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函数或任何其他类型的长编码
我希望这对很多人也有用。