在swift中实现一个像tableviewCell中的button

我想在每个tableview单元格中做一个像button一样。 当它被按下时,button将变成“不同”。 我能够做到这一点,创build一个IBOutlet在我的子类和IBAction方法在我的tableviewcontroller类使用sender.setTitle(“不像”,forState:UIControlState.Normal)。 但是当我点击它的时候,这个方法也会把一堆其他的tableviewcell的button也变成“不一样”,实质上就是复制了一个单元格的行为。 这样做的方式是改变其他单元格,所以如果我点击2个连续单元格的“like”button,表格视图中的所有单元格将变成“不同”。 这是我的tableViewController的代码:

class TableViewController: UIViewController,UITableViewDataSource,UITableViewDelegate { @IBOutlet weak var tableView: UITableView! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 30 } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { var cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as TableViewCell cell.tag = indexPath.row cell.like.tag = indexPath.row cell.like.addTarget(self, action: "handleLikes:", forControlEvents: .TouchUpInside) return cell } @IBAction func handleLikes(sender: AnyObject){ println(sender.tag) // This works, every cell returns a different number and in order. sender.setTitle("Pressed", forState: UIControlState.Normal) } 

这里是我的TableViewCell类的代码:

 class TableViewCell: UITableViewCell { @IBOutlet weak var like: UIButton! override func awakeFromNib() { super.awakeFromNib() // Initialization code } override func setSelected(selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) // Configure the view for the selected state } } 

此外,这是不相关的,但如果有人读这可以告诉我如何可以改善我的风格和/或代码的清晰度,我也会很感激。

UITableViewCell是可重用的。 这意味着您必须为每个单元格设置标题为“不同”或“喜欢”。 最简单的方法,因为我想你会读数据反正,将是在您的ViewController创build一个string数组

添加到你的ViewControllervar likes: [String]!

在ViewDidLoad中: likes = [String](count: 20, repeatedValue: "like")请注意,长度应该基于您要显示的UITableViewCells的数量。

你的cellForRowAtIndexPath

 func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! { let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as TableViewCell cell.like.tag = indexPath.row cell.like.addTarget(self, action: "handleLikes:", forControlEvents: .TouchUpInside) cell.like.setTitle(likes[indexPath.row], forState: UIControlState.Normal) return cell } 

handleLikesfunction:

 func handleLikes(sender: AnyObject){ println(sender.tag) // This works, every cell returns a different number and in order. if likes[sender.tag] == "like" { likes[sender.tag] = "unlike" } else { likes[sender.tag] = "like" } sender.setTitle(likes[sender.tag], forState: UIControlState.Normal) }