我尝试了很多方法,但仍然无法前往另一个ViewController
。这是我的故事板。
https://docs.typo3.org/typo3cms/TyposcriptReference/Functions/Typolink/Index.html
这是我的代码。
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as? HistoryMainTableViewCell {
listItems.sort() { $0.seq > $1.seq }
let history = listItems[indexPath.row]
cell.setValue(history: history)
return cell
} else {
return HistoryMainTableViewCell()
}
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "vcProductHistory" {
if let productHistoryPage = segue.destination as? HistoryProductViewController {
if let IndexPath = tableViewHistory.indexPathForSelectedRow {
let historyArray = listItems[IndexPath.row]
productHistoryPage.history = historyArray
}
}
}
}
答案 0 :(得分:0)
试用此代码:(未经测试的代码)
注意:下面的代码会触发prepare segue。当tableViewCell被选中时。让我知道代码有效......
func tableView(_ tableView: UITableView, didSelectRowAtIndexPath indexPath: IndexPath) {
// let indexPath = myTableView!.indexPathForSelectedRow
// let currentCell = tableView.cellForRow(at: indexPath)! as UITableViewCell
//sendSelectedData = (currentCell.textLabel?.text)! as String as NSString
performSegue(withIdentifier: "vcProductHistory", sender: self)
}
答案 1 :(得分:0)
根据您对我的初始评论的回答:将行从初始vc拖到目标vc告诉你的vc有关segue,准备segue告诉你的vc什么时候触发segue,但是你仍需要让你的vc知道什么时候应该执行segue。试试这个:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as? HistoryMainTableViewCell else { return HistoryMainTableViewCell() }
let history = listItems[indexPath.row]
cell.setValue(history: history)
return cell
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "vcProductHistory" {
guard let productHistoryPage = segue.destination as? HistoryProductViewController, let indexPath = sender as? IndexPath else { return }
let historyArray = listItems[indexPath.row]
productHistoryPage.history = historyArray
}
}
func tableView(_ tableView: UITableView, didSelectRowAtIndexPath indexPath: IndexPath) {
performSegue(withIdentifier: "vcProductHistory", sender: indexPath)
}
我认为使用guard语法有点整洁。此外,它使用sender作为indexPath,而不是使用tableView.indexPathForSelectedRow。
另外,我注意到你在cellForRowAtIndexPath中有这个:
listItems.sort() { $0.seq > $1.seq }
您在cellForRowAtIndexPath中对数据源进行排序。你不能那样做,因为每个行都会单独调用该函数。在调用之前需要进行排序,比如viewWillAppear。此外,要对数组进行排序,您需要在排序后删除()。试试这个。
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
listItems.sort { $0.0.seq > $0.1.seq }
tableView.reloadData()
}
答案 2 :(得分:0)
我认为您应该连接到UINavigationController,而不是连接到HistoryProductionViewController
因为您的MainViewController的segue连接到导航控制器
我猜func prepareForSegue
segue.identifier == "vcProductHistory"
可行,但if let productHistoryPage = segue.destination as? HistoryProductViewController
不起作用
因为您的目标ViewController的类是NavigationController
你应该致电
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "vcProductHistory" {
if let naviVC = segue.destination as? UINavigationController {
if let productHistoryPage = naviVC.topViewController as? HistoryProductViewController {
if let IndexPath = tableViewHistory.indexPathForSelectedRow {
let historyArray = listItems[IndexPath.row]
productHistoryPage.history = historyArray
}
}
}
}
}
答案 3 :(得分:0)