如何将数据从UITableViewCell传递到ViewController?

时间:2015-07-31 10:58:41

标签: ios swift uitableview parse-platform viewcontroller

我已经按照多个教程,并在这里尝试了很多答案,但我似乎无法弄清楚问题是什么。

这是我的代码:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

        println("You selected cell #\(indexPath.row)!")


        let indexPath = homeTimelineTableView.indexPathForSelectedRow()
        let currentCell = homeTimelineTableView.cellForRowAtIndexPath(indexPath!) as! ProductTableViewCell

        productTitle = currentCell.productCellTitleLabel!.text

        println("The product title is \(productTitle)")


        self.performSegueWithIdentifier("timelineDetail", sender: self)

    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

        var titleLables: String!

        if (segue.identifier == "timelineDetail") {

            println("it works thus far!")

            let viewController = segue.destinationViewController as! ProductDetailViewController



            let selectedRow = homeTimelineTableView.indexPathForSelectedRow()!.row

            viewController.titleLabel?.text = productTitle


        }else {

            println("wtf is wrong with your code?!")
        }




    }

我没有收到任何错误。但是,当我去运行我的应用程序时,我的产品标题仍然拒绝传递给viewcontroller。 有什么建议?感谢。

3 个答案:

答案 0 :(得分:2)

在此阶段viewController.titleLabel为零(您正在使用?,这就是为什么没有错误)

正确的方法应该是:

  • 在ProductDetailViewController
  • 中添加var productTitle: String!
  • 将productTitle传递给UILabel,但传递给viewController.productTitle
  • 在ProductDetailViewController的viewDidLoad中设置viewController.titleLabel?.text = self.productTitle

答案 1 :(得分:0)

必须从prepareForSegue方法中当前选定的单元格中分配productTitle变量。

检查以下代码。

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

    var titleLables: String!

    if (segue.identifier == "timelineDetail") {

        println("it works thus far!")

        let viewController = segue.destinationViewController as! ProductDetailViewController

        let selectedRow = homeTimelineTableView.indexPathForSelectedRow()!.row

        let currentCell = homeTimelineTableView.cellForRowAtIndexPath(indexPath!) as! ProductTableViewCell

        productTitle = currentCell.productCellTitleLabel!.text

        viewController.titleLabel?.text = productTitle
    } else {
        println("wtf is wrong with your code?!")
    }
}

答案 2 :(得分:0)

这两个问题最为棘手:

let indexPath = homeTimelineTableView.indexPathForSelectedRow()
let currentCell = homeTimelineTableView.cellForRowAtIndexPath(indexPath!) as! ProductTableViewCell

首先,func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)已经提供了所选的indexPath。不需要let indexPath = ...

其次,不要加载单元格的值(如果单元格可见,则返回nil,tableView.visibleCells()带来其他问题),但是使用数据源获取所选indexPath的项目。

总的来说,它可能看起来像:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    // `indexPath` comes from the function parameters
    let item = model.itemAtIndexPath(indexPath)
    // the 'model'-part should be the same like in `cellForRow:indexPath`
    // your mission is only to get the item at the path, not the cell

    productTitle = item.title
    self.performSegueWithIdentifier("timelineDetail", sender: self)
}