Пользовательская проблема прокрутки таблицы в ячейках

У меня есть программно созданное табличное представление

var tableView: UITableView  =   UITableView()
var items = ["1","2","3","4","5","6"," 1","L 2","La 3","La 4","La 5","La 6","L 7","La 8","La 9","La 10","La 11","Lab 12","Lab 13","Lab 14","Lab 15","Lab 16","Lab 17","Lab 18","Lab 19","Lab 20","La 1","L 2","La 3"]

   override func viewDidLoad() {
    super.viewDidLoad()
    tableView.frame         = CGRectMake(0, 50, self.view.frame.width,100);  //If we give self.view.frame.height It worked because no need to scroll
    tableView.delegate      = self
    tableView.dataSource  =  self
    tableView.estimatedRowHeight = 30
   tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "Cell")
    self.view.addSubview(tableView)
    }

Вот код, у которого есть проблема

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    var cell:UITableViewCell = tableView.dequeueReusableCellWithIdentifier("Cell") as! UITableViewCell
        if indexPath.row == 2 || indexPath.row == 3 {
            var redBtn = UIButton()
            redBtn = UIButton(frame: CGRectMake(0, 0, 40, 40))
            redBtn.backgroundColor = UIColor.redColor()
            redBtn.setTitle("das", forState: UIControlState.Normal)         
            cell.contentView.addSubview(redBtn)
        }else {
        cell.textLabel?.textAlignment = NSTextAlignment.Center
        cell.textLabel?.text = items[indexPath.row]
       }
       return cell
   }
}

Только во 2-й и 3-й строке мне нужно отобразить кнопку. Но при прокрутке таблицы она отображается во всех ячейках. Если увеличить высоту таблицы до высоты просмотра, тогда нет проблем, потому что прокрутки не происходит.

Я прочитал этот вопрос проблема прокрутки и перерисовки UITableView из этого, я обнаружил, что это из-за повторного использования проблема с ячейкой при прокрутке. Но это решение мне не помогло.

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

Заранее спасибо


person Lydia    schedule 30.05.2015    source источник


Ответы (1)


Когда вы повторно используете ячейки, старые значения все еще сохраняются в них, поэтому каждый раз, когда вы используете dequeueReusableCellWithIdentifier, вам необходимо сбросить значения по умолчанию или последние значения, все еще кэшированные в нем. В вашем конкретном случае вам нужно удалить кнопки, которые вы создаете из ячейки, или скрыть их в своем операторе else.

Из документации Apple:

Реализация источника данных табличного представления tableView:cellForRowAtIndexPath: всегда должна сбрасывать все содержимое при повторном использовании ячейки.

Лучший способ реализовать это — создать настраиваемую ячейку со всеми компонентами, которые вам нужны (кнопка, метка и т. д.), когда вы удаляете новые настраиваемые ячейки из очереди, вы превращаете свойство hidden в true или false по мере необходимости.

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    var cell:UITableViewCell = tableView.dequeueReusableCellWithIdentifier("Cell") as! MyCustomCell
        if indexPath.row == 2 || indexPath.row == 3 {
            redBtn.hidden = false
            cell.contentView.addSubview(redBtn)
        }else {
            redBtn.hidden = true
            cell.textLabel?.textAlignment = NSTextAlignment.Center
            cell.textLabel?.text = items[indexPath.row]
      }
      return cell

В этом случае не рекомендуется программно создавать кнопку «на лету», так как вам придется зацикливать все подпредставления в ячейке для каждой повторно используемой ячейки, чтобы узнать, существует ли она уже, чтобы решить, нужно ли вам создавать или удалять , как показано ниже:

for button:AnyObject in subviews{
    if(button .isKindOfClass(UIButton)){
       if(button.accessibilityIdentifier == "MyButton"){
            println("Button Already Exists")
        }else{
            println("Create new button")
        }
    }
}

Я надеюсь, что это поможет вам

person Icaro    schedule 30.05.2015
comment
var cell:UITableViewCell = tableView.dequeueReusableCellWithIdentifier(Cell) as! MyCustomCell в этом, как я могу определить Mycustomcell, я объявил так var mycustomcell: UITableViewCell! но не работал - person Lydia; 30.05.2015
comment
Вам нужно будет создать пользовательскую ячейку, и эта ячейка будет иметь имя класса, это имя является просто примером. Вот отличный учебник о том, как создать пользовательскую ячейку, если вы никогда этого раньше не делали. raywenderlich.com/87975/ - person Icaro; 30.05.2015
comment
Теперь только мне нужно начать. У меня есть вопрос, где создается redbtn в классе customcell или в главном представлении. - person Lydia; 01.06.2015
comment
Все, что находится внутри ячейки, будет создано в классе customCell, включая кнопку redBtn. Удачи! - person Icaro; 01.06.2015