2016-03-21 5 views
0

Я пытаюсь добавить градиент к первой ячейке в моем UITableView.Редактировать только первую ячейку в UITableView

Вот инструкция if, которую я использую, чтобы определить, является ли ячейка первой в таблице.

if (indexPath.row == 0 && indexPath.section == 0) { 

Этот код не будет работать, поскольку есть несколько клеток с градиентом, особенно первая и последняя ячейка вместе с иногда второй ячейкой. Это довольно странно, поскольку информация, которую я захватываю в массиве с помощью indexPath.row, получает информацию из правильной позиции.

Почему мое заявление if не работает? Хотя я собираю информацию из правильного местоположения в массиве.

+0

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

+0

@ Josh Hamet, который не должен вызывать проблема, потому что ячейки, которые находятся в моей таблице, остаются в одной и той же позиции. У меня их не было. – brettf

+0

Из-за того, что ячейки используются повторно по соображениям производительности, вы _must_ обрабатываете регистр для других ячеек (например, задайте нужный цвет фона вместо градиента) – Alladinian

ответ

1

Возможно, вы не используете prepareForReuse в своем пользовательском подклассе UITableViewCell. Похоже, вы правильно нацеливаете первую ячейку, поэтому, возможно, когда эта ячейка будет повторно использована для других путей указателей, вы не очищаете ранее добавленный градиент.

+0

Как переопределить 'prepareForReuse', чтобы сделать так, чтобы ячейка« сбрасывала »себя до точки, прежде чем добавить дополнительный слой? – brettf

+0

@brettf Сложно сказать наверняка, не увидев ваш код, но я подумал, что ваша пользовательская ячейка должна иметь ivar, который ссылается на слой градиента, который он вставляет. В методе 'prepareForReuse' он будет делать что-то вроде' self.gradientLayer.removeFromSuperlayer() '.Чтобы это работало, ваш UITableViewDataSource должен вызывать только метод в пользовательской ячейке, например 'showGradient()', вместо того, чтобы вставлять этот слой из класса пользовательских ячеек. Если пользовательский класс ячейки управляет вставкой самого слоя градиента, он также может сохранять ссылку на него и удалять его при повторном использовании. –

1

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

if(first cell) 
    add gradient 
else 
    remove gradient if it exists 
+0

Как я могу удалить подуровень градиента? – brettf

+0

@brettf, не зная, как вы его настроили в первую очередь, я не знаю. – Stonz2

0
  1. Если вы используете пользовательские ячейки, установить пользовательскую переменную градиента ячейки, чтобы очистить цвет на всех, но в первую ячейку.

  2. Если вы используете стандартные ячейки uitableview, добавьте градиент в каждую ячейку по умолчанию, а затем, если это ваша первая ячейка, измените цвета градиента на все, что вам нужно, и очистите цвет по умолчанию.

  3. В качестве альтернативы очистить все подвиды из клетки после выделения его следующим образом:

    для (UIView * подразделов в cell.subviews) { [суб removeFromSuperview]; }

Затем добавьте свой градиент для первой ячейки.

Вариант 1 является самым чистым.

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