Значения повторяются при прокрутке в TableView

Когда я нажимаю кнопку в пользовательской ячейке, а затем прокручиваю вниз (или вверх), также нажимается другая кнопка ячейки. Я вижу, что она нажата, потому что выход кнопки, который я создал для кнопки, отключен.

мой 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
    }

Это numberOfRowsInSection а также cellForRowAtIndexPath

 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!)"

}

Я регистрирую это в viewDidLoad над super.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
}

Любая помощь и предложения много значат.

Спасибо.


Ссылочные ссылки, которые я использовал:

Я ссылался на несколько ссылок, но они были в target-c и не помогли:

UICollectionView Tap выбирает более одной ячейки

Как использовать метод prepareForReuse

Я также сослался на документы, и это не сильно помогло.

1 ответ

Решение

Из кода, который вы опубликовали, становится ясно, что вы не устанавливаете enabled собственность UIButton с уважением к DataSource(Массив и его объекты, которые вы используете для загрузки табличного представления, то есть элементы в objects массив). Независимо от объектов, содержащихся в этом массиве, добавьте свойство, чтобы определить, должно ли условие для кнопки быть истинным или ложным, а затем в cellForRowAtIndexPath установите свойство enabled кнопки в соответствии с этим. Когда кнопка нажата, добавьте обратный вызов в 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)
}

В ViewController:

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?.buttonEnabled = objects[indexPath.row].isEnabled //The new property you need to add. true by default
        cell?.delegate = self //Make sure you implement the delgate
        cell?.votesLabel?.text = "\(votes!)"    
        return cell?
}

func buttonClicked(cell : PFTableViewCell)
{
     //Here, get the indexPath using the cell and assign the new property in the array.
}

Обратите внимание, что приведенный выше код является грубым. Просто получите идею из кода и реализуйте ее в соответствии с вашими требованиями.

Другие вопросы по тегам