2015-12-11 4 views
1

Когда я выбираю ячейку в UITableView, я меняю свое изображение, но меняет камеру из поля зрения (нужно прокрутить вниз, чтобы увидеть затронутую ячейку), что означает, что затронутая ячейка также измените его изображение. Это должно быть что-то о повторно используемых ячейках, но я не могу понять, почему и как решить эту проблему. Надеюсь, вы, ребята, можете мне помочь, спасибо.Выбор ячейки в UITableView влияет на другой.

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

Вот мои делегаты для UITableView:

//UITableview delegate 
func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    return 1 
} 

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return Arecipe.IngredientArr.count 
} 

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    return UITableViewAutomaticDimension; 
} 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    if (tableView == IngrediensTableView) { 
     print("Cell") 

     var cell = tableView.dequeueReusableCellWithIdentifier("Cell") 

     let ingredient = self.Arecipe.IngredientArr[indexPath.row] 

     if ((cell == nil)) { 
      cell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "Cell") 
      cell!.imageView?.image = UIImage(named: "Ingr_Uncheck") 
     } 

     cell!.textLabel?.text = ingredient.UnitValue + " " + ingredient.UnitName + " " + ingredient.Name 
     cell!.selectionStyle = .None 

     return cell! 
    } 
    return UITableViewCell() 
} 

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    print("Row \(indexPath.row) selected") 

    if (tableView == IngrediensTableView) { 
     let cell: UITableViewCell = tableView.cellForRowAtIndexPath(indexPath)! 

     print(cell.textLabel?.text) 

     if(cell.imageView?.image == UIImage(named: "Ingr_Uncheck")) { 
      cell.imageView?.image = UIImage(named: "Ingr_Check") 
     } else { 
      cell.imageView?.image = UIImage(named: "Ingr_Uncheck") 
     } 
    } 
} 
+0

я была аналогичная проблема с этим. .if раз вам нужно увидеть NSCache, если вы не используете эту библиотеку «sdwebimage» .. это сделает все для вас ... сохраняя все изображения в каталоге документа и повторно используя его ... –

ответ

2

пораженная клетка также измените его изображение. Это должно быть что-то о повторно используемых ячейках.

Правильно! Причина в том, что вы установили изображение Ingr_Uncheck только в совершенно новую ячейку. Если ячейка используется повторно, вы пропускаете настройку изображения, сохраняя все, что было установлено ранее.

Решение об установке Ingr_Check vs. Ingr_Uncheck Изображение должно быть выполнено в зависимости от состояния модели вашей таблицы.

if(myCodeThatChecksIfRowIsChecked(indexPath.row)) { 
    cell!.imageView?.image = UIImage(named: "Ingr_Check") 
} else { 
    cell!.imageView?.image = UIImage(named: "Ingr_Uncheck") 
} 

Теперь правильное изображение устанавливается как новых, так и повторно используемых клеток, убедившись, что повторное использование ранее проверенных ячейки не изменяет визуальные эффекты.

Код myCodeThatChecksIfRowIsChecked должен рассчитываться в некоторых хранилищах, которые вы внесете в свой метод didSelectRowAtIndexPath. Здесь вам необходимо сохранить список номеров строк для проверенных ячеек. Это также список, который вы консультируете, чтобы решить, следует ли отключить ячейку или нет: делать это на основе изображения не является правильным.

+0

Благодарим вас за ответ.Извините, я не упомянул об этом в своем вопросе, но выполнение того, что вы говорите, приведет к сбросу изображения ячейки, когда оно будет прокручиваться с глаз долой, но мне нужна клетка, чтобы держать ее изображение, даже если оно скрыто из виду. –

+0

@LocDaiLe я вижу. См. Редактирование. Исправление немного сложнее - вам нужно иметь код, который, учитывая номер строки, может определить, проверял ли пользователь его или нет. Для этого вам нужно сохранить состояние checked/unchecked где-нибудь (в вашей модели). Посмотрите на это состояние внутри вашей функции 'myCodeThatChecksIfRowIsChecked', чтобы принять решение. – dasblinkenlight

+0

Итак, вы говорите, что мне нужен массив, чтобы отслеживать, какие ячейки выбраны или нет? –

1

и не могу сравнить 2 UIImage от "=="

if(cell.imageView?.image == UIImage(named: "Ingr_Uncheck")) 

использование этого

if([UIImagePNGRepresentation(cell.imageView?.image) isEqual:UIImagePNGRepresentation(UIImage(named: "Ingr_Uncheck"))] == YES) 
+0

Благодарим вас за ответ @vaibby, но сравнение двух uiimages отлично работает , При выборе ячейки изображение меняется. –

+0

Возможно, вы можете, но вы не должны ... – TheEye

+0

@vaibby, я не согласен с вами. вы можете сравнить с «==», он будет проверять, что оба экземпляра одинаковы или нет. Наверное, это не то, что вам нужно –

0

Вы можете решить это двумя способами. Либо установить изображение в nilcellForRow

cell.imageView?.image = nil 

Или если у вас есть пользовательский класс для ячейки, реализовать

override func prepareForReuse() { 
    imageView?.image = nil 

} 

Сброс с нуля или с изображением по умолчанию