Значения повторяются при прокрутке в 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.
}
Обратите внимание, что приведенный выше код является грубым. Просто получите идею из кода и реализуйте ее в соответствии с вашими требованиями.