在TableView

时间:2015-11-24 16:23:57

标签: swift uitableview custom-cell prepareforreuse

当我点击自定义单元格中的按钮然后向下(或向上)时,还会点击另一个单元格按钮。我看到它被点击了,因为我为按钮创建的按钮插座被禁用了。

我的cellForRowAtIndexPath有一个单元格的reuseIdentifier:

var cell: FeedTableViewCell? = tableView.dequeueReusableCellWithIdentifier("MusicCell") as? FeedTableViewCell

考虑到我degueueReusableCellWithId中有cellForRowAtIndexPath,我需要prepareForReuse吗?当我在自定义单元格文件中添加prepareForReuse时,单元格会回到默认值(显然是因为我将其重置为默认值)。问题是我希望它保留每个indexPath.row的值。

这就是我查询价值观的方式:

 override func queryForTable() -> PFQuery {
        var query:PFQuery = PFQuery(className:"Music")

        if(objects?.count == 0)
        {
            query.cachePolicy = PFCachePolicy.CacheThenNetwork
        }

        query.orderByAscending("videoId")

        return query
    }

这是numberOfRowsInSectioncellForRowAtIndexPath

 override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
     return  objects!.count
    }


   override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath, object: PFObject?) -> PFTableViewCell? {

        var cell: FeedTableViewCell? = tableView.dequeueReusableCellWithIdentifier(cellIdentifier) as? FeedTableViewCell
        if(cell == nil) {
            cell = NSBundle.mainBundle().loadNibNamed("FeedTableViewCell", owner: self, options: nil)[0] as? FeedTableViewCell
        }
        if let pfObject = object {
               //I took out the irrelevant methods. I can add them if that makes a difference... 
                var votes:Int? = pfObject["votes"] as? Int
                if votes == nil {
                    votes = 0
        }
        cell?.votesLabel?.text = "\(votes!)"

}

我在super.viewDidLoad()

上面的viewDidLoad注册了这个
 tableView.registerNib(UINib(nibName: "FeedTableViewCell", bundle: nil), forCellReuseIdentifier: cellIdentifier)

这是customCell中的按钮查询:

@IBAction func heartButton(sender: AnyObject) {
        if(parseObject != nil) {
            if var votes:Int? = parseObject!.objectForKey("votes") as? Int {
                votes!++

                parseObject!.setObject(votes!, forKey: "votes")
                parseObject!.saveInBackground()

                votesLabel?.text = "\(votes!)"
            }
        }
        heartOutlet.enabled = false
}

任何帮助和建议都意味着很多。

谢谢。

我使用的REFRENCE LINK:

我提到了几个链接,但它们是客观的,并没有帮助:

UICollectionView Tap Selects More Than One Cell

How to use prepareForReuse method

我也提到了文档,但这并没有多大帮助。

1 个答案:

答案 0 :(得分:2)

从您发布的代码中可以清楚地看出,您没有针对enabled设置UIButton的{​​{1}}属性(您正在使用的数组及其对象)加载tableview,即DataSource数组中的元素。无论数组包含哪些对象,添加一个属性以确定按钮的条件是真还是假,然后在objects中根据该属性设置按钮的enabled属性。单击该按钮时,向ViewController添加一个回调(使用委托)并在那里设置属性。

示例代码

在自定义单元格类中:

cellForRowAtIndexPath

在ViewController中:

protocol CellButtonDelegate
{
    func buttonClicked(cell : PFTableViewCell)
}

public var delegate : CellButtonDelegate?

public var buttonEnabled : Bool?
{
    get
    {
        return heartOutlet.enabled
    }
    set
    {
        heartOutlet.enabled = newValue
    }
}

@IBAction func heartButton(sender: AnyObject) {
        if(parseObject != nil) {
            if var votes:Int? = parseObject!.objectForKey("votes") as? Int {
                votes!++

                parseObject!.setObject(votes!, forKey: "votes")
                parseObject!.saveInBackground()

                votesLabel?.text = "\(votes!)"
            }
        }
        delegate?.buttonClicked(self)
}

请注意,上面的代码很粗糙。只需从代码中获取想法并根据您的要求实施它。