TableViewCell到ViewController - Swift

时间:2016-10-30 06:12:43

标签: ios swift xcode uitableview viewcontroller

我尝试了很多方法,但仍然无法前往另一个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
            }
        }
    }
}

4 个答案:

答案 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)

您的解决方案 - 正如您所描述的 - 应该可行。 这里最多的工作可以直接在Storyboard中完成。 在TableView中选择原型单元格,将Segue拖到NavigationController并选择presentModally
Variant 1 Setup

这应该没有进一步的魔力。 选择TableViewCell时,应显示NavigationController。此时也不需要代码(TableView的人口除外) 如果不是 - 您可能通过将选择设置为TableView来错误配置No Selection

Selection set to no selection?

或者您在某处将User Interaction Enabled设置为false。