2015-07-31 4 views
0

Я следил за несколькими учебниками и пробовал много ответов здесь, но я не могу понять, в чем проблема.Как передавать данные из UITableViewCell в 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. Любые предложения? Благодарю.

ответ

2

На этом этапе viewController.titleLabel равна нулю (вы используете ?, поэтому нет никакой ошибки)

Правильный подход должен быть:

  • добавить var productTitle: String! в ProductDetailViewController
  • проход productTitle не UILabel, но до viewController.productTitle
  • в viewDidLoad производителя ProductDetailViewController viewController.titleLabel?.text = self.productTitle
+0

Это сработало! Если бы вы знали, как долго я пытаюсь это понять. Спасибо! – V1P3R

0

Переменная productTitle должна быть назначена из выбранной в данный момент ячейки метода prepareForSegue.

Проверьте, пожалуйста, код.

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?!") 
    } 
} 
0

Проблема наиболее lilely в этих двух строках:

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

Во-первых, func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) обеспечивает уже выбранный indexPath. Нет необходимости в let indexPath = ....

Во-вторых, не загружайте значение ячейки (которое возвращает ноль, если ячейка видна, а 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) 
} 
Смежные вопросы