【问题标题】:Passing data from TableViewController to TableViewCell将数据从 TableViewController 传递到 TableViewCell
【发布时间】:2014-10-22 22:28:58
【问题描述】:

我创建了一个 TableViewController 并显示了一些来自数组的数据。 我还必须创建一个 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
  }

}

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

现在,我每次按下您可以在图片中看到的“地址”按钮时都需要访问房产地址。 所以我尝试在 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 只是返回数组 people) 但奇怪的是我收到的数组是空的,我不明白为什么。

感谢您的支持

【问题讨论】:

    标签: ios uitableview swift parameter-passing


    【解决方案1】:

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

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

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

    并将playActionX: 函数移动到表格视图控制器。从那里,您可以将标签用作人员数组的索引。

    【讨论】:

    • 我刚刚尝试过,它正在工作!谢谢!!我不知道怎么做,但是当我在收到以下错误“无法识别的选择器发送到实例”之前尝试时,这就是为什么我决定将函数 playActionX 移动到 TableViewCell 类中的原因。谢谢!!
    【解决方案2】:

    由于您设置了tag = indexPath.row,您将能够以与cellFoRowAtIndexPath 相同的方式找到地址,即:people[sender.tag].address

    您在尝试中发现数组为空的原因是您已经分配了一个新的数组以及新的视图控制器。

    【讨论】:

    • 感谢您的回答。但是我的数组没有在 TableViewCell 中定义,这就是问题所在。我怎样才能从另一个班级访问它?
    【解决方案3】:

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

    【讨论】:

    • 感谢您的回答,我无法以这种方式访问​​数组 people,因为该数组是在 TableViewController 类中定义的,而不是在 TableViewCell 类中定义的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-26
    相关资源
    最近更新 更多