我创建了一个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
}
}
表格打印得很好,如下图所示:
现在,每次按下图片中可以看到的“地址”按钮,我都需要访问属性地址。 所以我尝试使用以下代码,在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只是返回数组的人) 但奇怪的是,我收到它的数组是空的,我不明白为什么。
感谢您的支持
答案 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
内部调用)。