Реализация кнопки "Мне нравится" в табличном представлении ячейки в Swift

Я пытаюсь сделать кнопку "Мне нравится" в каждой из моих ячеек таблицы. Когда она нажата, кнопка изменится на "в отличие". Я смог сделать это, создав IBOutlet в моем подклассе и метод IBAction в моем классе tableviewcontroller, используя sender.setTitle("непохожий",forState: UIControlState.Normal). Но когда я щелкаю по нему, метод превращает кучу кнопок других табличных ячеек в "непохожее", по сути, дублируя поведение одной ячейки. То, как это происходит, заключается в том, что он меняет каждую другую ячейку, поэтому, если я нажму кнопку "Мне нравится" из двух последовательных ячеек, все ячейки в табличном представлении станут "непохожими". Вот мой код для 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
    }

}

Кроме того, это не имеет отношения, но если кто-нибудь, читающий это, скажет мне, как я могу улучшить свой стиль и / или ясность кода, я был бы также признателен за это.

1 ответ

Решение

UITableViewCellс многоразовым. Это означает, что вы должны установить заголовок "в отличие" или "нравится" для каждой ячейки. Самый простой способ, поскольку я полагаю, что вы все равно будете читать данные, это создать массив строк в вашем 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
}

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)
}
Другие вопросы по тегам