将数据从TableViewController传递到TableViewCell

时间:2014-10-22 14:04:07

标签: ios uitableview swift parameter-passing

我创建了一个TableViewController,我正在显示一些来自Array的数据。 我还必须创建一个TableViewCellController,因为我需要为每一行都有一个按钮,它必须执行一个动作。

所以,这是我的TableViewController的一部分:

struct person {
  var name:String
  var age:String
  var address:String
}
class myTableViewController: UITableViewController {
  var people = Array<person>()

  override func viewDidLoad() {
    super.viewDidLoad()

    var x = person(name: "Marco", age: "28", address: "street a")
    var y = person(name: "Pippo", age: "90", address: "street b")
    people.append(x)
    people.append(y)
  }

  override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> myTableViewCell {
    let CellId: String = "Cell"
    var cell: myTableViewCell = tableView.dequeueReusableCellWithIdentifier(CellId) as myTableViewCell
    cell.textLabel!.text = people[indexPath.row].name
    return cell
  }

}

表格打印得很好,如下图所示:

Table View Controller

现在,每次按下图片中可以看到的“地址”按钮,我都需要访问属性地址。 所以我尝试使用以下代码,在TableViewController类中:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> myTableViewCell {
  let CellId: String = "Cell"
  var cell: myTableViewCell = tableView.dequeueReusableCellWithIdentifier(CellId) as myTableViewCell
  cell.textLabel!.text = people[indexPath.row].name

  cell.buttonPlay?.tag = indexPath.row
  cell.buttonPlay?.addTarget(cell, action: "playActionX:", forControlEvents: UIControlEvents.TouchUpInside)

  return cell
}

并且,从TableViewCell我正确地收到标记:

class TableViewCell: UITableViewCell {

  func playActionX(sender:UIButton!) {
    println(sender.tag)
  }

一切都很好。但问题是,我无法在标签内发送字符串,我不知道如何从我的TableViewController访问“地址”字段。

我可以使用什么解决方案? PS。我试图为TableViewController类创建一个实例:

func playActionX(sender:UIButton!) {
  println(sender.tag)
  let instance:MyTableViewController = MyTableViewController()
  println(instance.getPeopleArray())
}

(getPeopleArray只是返回数组的人) 但奇怪的是,我收到它的数组是空的,我不明白为什么。

感谢您的支持

3 个答案:

答案 0 :(得分:2)

您的getPeopleArray为空,因为您正在创建MyTableViewController的新实例,而不是访问现有实例。但不要走那条路。相反,只需将按钮的目标/操作更改为视图控制器,而不是单元格。所以改变:

cell.buttonPlay?.addTarget(cell, action: "playActionX:", forControlEvents: UIControlEvents.TouchUpInside)

cell.buttonPlay?.addTarget(self, action: "playActionX:", forControlEvents: UIControlEvents.TouchUpInside)

并将playActionX:函数移动到表视图控制器。从那里,您可以使用标记作为人员阵列的索引。

答案 1 :(得分:0)

由于您设置了tag = indexPath.row,因此您可以使用与cellFoRowAtIndexPath相同的方式查找地址,即:people[sender.tag].address

您尝试在阵列中找空的原因是您已经为新视图控制器分配了一个新阵列。

答案 2 :(得分:0)

只要您在cellForRowAtIndexPath中分配按钮标记,就应该能够使用people[sender.tag]访问人员数组中的对象(从playActionX内部调用)。