在swift中的tableviewCell中实现like按钮

HS_*_*_HS 4 uitableview ios swift social-media-like

我想在每个tableview单元格中创建一个类似按钮.按下时,按钮将变为"不同".我能够通过使用sender.setTitle("不同于",forState:UIControlState.Normal)在我的子类中创建IBOutlet和在tableviewcontroller类中创建IBAction方法来实现此目的.但是当我点击它时,该方法将一堆其他tableviewcell的按钮变为"不同",基本上复制了一个单元格的行为.这样做的方式是它会改变其他所有单元格,因此如果单击2个连续单元格的"like"按钮,表格视图中的所有单元格将变为"不同".这是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)
    }
Run Code Online (Sandbox Code Playgroud)

这是我的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
    }

}
Run Code Online (Sandbox Code Playgroud)

此外,这是无关的,但如果有人读这篇文章可以告诉我如何改进我的风格和/或代码的清晰度,我也会很感激.

Cal*_*leb 12

UITableViewCells是可重用的.这意味着您必须为每个单元格将标题设置为"不同"或"相似".最简单的方法,因为我认为你无论如何都会阅读数据,就是在你的数据库中创建一个字符串数组ViewController

将此添加到您的ViewController:var 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
}
Run Code Online (Sandbox Code Playgroud)

handleLikes 功能:

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)
}
Run Code Online (Sandbox Code Playgroud)