按下时更改单元格中的按钮

时间:2015-09-07 08:44:13

标签: ios swift

我正在尝试在按下时更改按钮的颜色。目前它位于表格视图单元格内。

我这样做的方式就是这样添加:

@IBAction func upVote(sender: AnyObject) {
        sender.setImage(UIImage(named: "bUpVote"), forState: .Normal)
    }

这是在单元类(而不是视图控制器类)内完成的。

它可以工作,但是这个改变也适用于跟随它的每个第三个单元格用于表的其余部分。 有什么工作吗?谢谢!

3 个答案:

答案 0 :(得分:1)

有很多方法可以解决这个问题,其中一种方法如下

将此添加到 customCell

@objc protocol MyTableViewCellDelegate {
func controller(controller: MyTableViewCell, button: UIButton, selectedButtonIndexPath : NSIndexPath)
}


class MyTableViewCell: UITableViewCell {
var delegate: AnyObject?
var indexPath : NSIndexPath?
@IBOutlet weak var button: UIButton!//outlet of button

按钮操作

@IBAction func buttonAction(sender: UIButton)//IF the sender type is AnyObject, you have to change it as UIButton
{
    self.delegate?.controller(self,  button: sender, selectedButtonIndexPath: indexPath!)
}

将此添加到具有UITableView

ViewController 类中
 class MyTableViewController: UITableViewController, MyTableViewCellDelegate {  // I created a subClass of UITableViewController, your's may be different
var arraySelectedButtonIndex : NSMutableArray = []//global declaration

因为我在viewDidLoad()

中使用xib创建了我的自定义单元格
tableView.registerNib(UINib(nibName: "MyTableViewCell", bundle: nil), forCellReuseIdentifier: "CustomCell")//Since, I use custom cell in xib

通过添加此

来定义自定义单元格的委托
func controller(controller: MyTableViewCell, button: UIButton, selectedButtonIndexPath : NSIndexPath)
{
    if(arraySelectedButtonIndex .containsObject(selectedButtonIndexPath)==false)
    {
        arraySelectedButtonIndex.addObject(selectedButtonIndexPath)
        button.setImage(UIImage(named: "bUpVote")  , forState: .Normal)
    }
    else
    {
        arraySelectedButtonIndex.removeObject(selectedButtonIndexPath)//If you need to set Deselect image
        button.setImage(UIImage(named: "deselectImage") , forState: .Normal)//If you need to set Deselect image
    }
}

在tableView dataSource(cellForRowAtIndexPath

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier("CustomCell", forIndexPath: indexPath) as! MyTableViewCell
    cell.delegate = self
    cell.indexPath = indexPath
    if(arraySelectedButtonIndex .containsObject(indexPath))
    {
        cell.button.setImage(UIImage(named: "bUpVote"), forState: .Normal)
    }
    else
    {
        cell.button.setImage(UIImage(named: "deselectImage"), forState: .Normal)//If you need to set Deselect image
    }
    return cell
}

答案 1 :(得分:0)

这是因为tableView重用了单元格。如果您需要在单元格中保持子视图的状态,则需要更新数据源并反映cellForRowAtIndexPath方法中的更改。

答案 2 :(得分:0)

这不是这样做的方法。您可以在模型中存储按钮的状态。例如:假设在项目模型中存储项目的upvoted状态:

class Post
{
var title : String
var upvoted : Bool
}

如何获取索引路径?

在自定义tableview子类上移动IBAction方法。将名为delegate的属性添加到单元格,并将其设置为cellForRowAtIndexPath:中的控制器。现在在action方法中通知代理。

我在此详细描述了这一点:https://stackoverflow.com/a/32250043/1616513

现在,当用户赞成您更新模型时:

@IBAction func upVotedInCell(sender: UITableViewCell) {

     var indexPath = self.tableView.indexPathForCell(sender)

     self.items[indexPath].upvoted = true

     self.tableView.reloadRowsAtIndexPaths([indexPath],UITableViewRowAnimation.None)
}