2015-11-24 3 views
1

Когда я нажимаю кнопку в пользовательской ячейке и затем прокручиваю вниз (или вверх), также постучивается другая кнопка ячейки. Я вижу, что он используется, потому что кнопка, которую я создал для кнопки, отключена.Значения повторяются при прокрутке в 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 
} 

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

спасибо.


REFRENCE ССЫЛКА Я использовал:

Я упомянул несколько ссылок, но они были в Objective-C и не помог:

UICollectionView Tap Selects More Than One Cell

How to use prepareForReuse method

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

+0

Добавить код UITableView Методы DataSource –

+0

Где я запрашиваю и отправляю данные из таблицыView? Или из пользовательской ячейки? @HarikrishnanT – lukaivicev

+0

. Методы источников данных в представлении таба включают в себя «cellForRowAtIndexPath», «numberOfCellsInTableView» и т. Д., Пожалуйста, напишите код 'cellForRowAtIndexPath' (и' willDisplayCell', если вы используете это тоже). Там должно быть что-то не так, что вы делаете там, что вызывает проблему. –

ответ

2

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

В 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. 
} 

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

+0

Я использую ParseUI для получения объектов, поэтому массив 'objects' - это свойство ParseUI, которое хранит эти объекты. Можете ли вы предоставить примерный код? У меня проблемы с пониманием логики того, где это должно быть размещено. Разве это не только актуально в 'cellForRowAtIndexPath'? Почему это было бы актуально в массиве 'objects', если у меня возникла проблема с UIButton и источником данных? @HarikrishnanT – lukaivicev

+0

Образец кода добавлен. Вы должны будете внести некоторые изменения в текущую логику после отправки кода, который я опубликовал. –

+0

Попробуйте сейчас! Большое спасибо! – lukaivicev

Смежные вопросы