2015-03-29 4 views
0

У меня есть UITableView с данными, полученными из веб-api (который также разбит на страницы и доступен для поиска). Каждая ячейка является обычным UITableViewCell, который я создал и содержит объект данных. Ячейка имеет два состояния, нормальные и добавленные.ios сохранить UITableViewCell макет после прокрутки

Обычный имеет одну кнопку «добавить», чтобы добавить объект данных в выбранный массив объектов. Добавленный режим схож, но с тем, чтобы содержимое было сдвинуто вправо на несколько пикселей, чтобы отобразить кнопку «удалить».

Когда я добавляю один элемент в массив, я анимирую ячейку для перемещения вправо и показываю кнопку удаления. Теперь моя проблема:

Когда я прокручиваю (или когда я делаю новый поиск), я, похоже, не знаю, как сбросить ячейку в «добавленное» состояние.

То, что я пробовал:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let myCustomCell = tableView.dequeueReusableCellWithIdentifier("MyCellIdentifier", forIndexPath: indexPath) as MyCustomCell 
    let dataObject = fromApiArray[indexPath.row] 
    myCustomCell.dataObject = dataObject 
    if selectedObjects.contains(dataObject) { 
     myCustomCell.setToAddedState = true //flag to use inside the cell code in prepareForReuse or wherever I don't really know... 
     myCustomCell.moveCellToRight() //just another way I tried. calling the method that animates the cell from the tableviewcontroller... (sounds silly I guess) 
    } 
    return myCustomCell 
} 

Я попытался назвать клетку moveCellToRight(), но я предполагаю, что клетка втягивается после возвращения его здесь с «нормальным» состоянием. Поскольку это не помогло, я пошел и установил логическое значение (setToAddedState) и попытался использовать методы prepareForReuse и layoutSubviews внутри ячейки, но это тоже не помогает.

Кроме того, некоторые ячейки фактически переходят в «добавленное» состояние, но случайным образом. Если я печатаю объект dataObject в пределах prepareForReuse, он печатает правильно. Так что моя единственная вещь, которая отсутствует здесь, заключается в том, как заставить ячейку отобразить правильное состояние.

Заранее благодарим за любую помощь.

+0

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

ответ

2

Там несколько вещей, которые вы пропустили здесь:

Во-первых, вы должны помнить, что dequeueReusableCellWithIdentifier: делает именно это. Он повторно использует ячейку, которая уже создана. Если ячейка не находится в состоянии, в котором вы хотите ее использовать (добавлено), вам нужно убедиться, что она находится в этом состоянии до ее отображения.

Во-вторых, если посмотреть на документацию для prepareForReuse

этот метод вызывается непосредственно перед тем, возвращается объект из метода UITableView dequeueReusableCellWithIdentifier:

который означает установку флага после dequeing в быть зарегистрированным в prepareForReuse будет слишком поздно. prepareForReuse следует использовать для сброса ячейки до состояния по умолчанию.

Наконец, если вашей ячейке требуется какое-либо определенное состояние переменной, которое должно быть установлено - будь то данные, макет, стиль и т. Д. - вы должны сделать это в реализации вашего делегата tableView:cellForRowAtIndexPath:.

В вашем коде было бы разумно установить «добавленное» состояние и макет ячейки непосредственно с tableView:cellForRowAtIndexPath:, как вы пытаетесь сделать. Установка флага - это не способ сделать это. В вашей ячейке должен быть установлен метод setAdded:, который показывает добавленное состояние немедленно, и ваш метод moveCellToRight также должен компоновать ячейку, как вы хотите, чтобы она была немедленно. Нет смысла оживлять это, поскольку на данный момент ячейка не видна.

Кроме того, вызов метода установки макета ячейки с tableView:cellForRowAtIndexPath: не является глупым, это именно то, что вы должны делать!

+0

Спасибо за ваш ответ. Но что-то не так. Иногда это работает, иногда это не так (более того, это не так, как при прокрутке, так и при создании нового поиска, который обновляет всю таблицу новыми данными). Теперь единственное, что у меня есть, это метод, который я вызываю, чтобы переместить ячейку вправо (без анимации, конечно, и, как вы указали), я вижу, что кадр обновляется (печать кадра на консоль), но вид больше всего с макетом по умолчанию. Я уверен, что мне не хватает чего-то другого. –

+0

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

+0

Возможно, вы можете отредактировать исходное сообщение, чтобы добавить соответствующий код ячейки, или связать сущность с кодом в одном из этих комментариев. – GraemeArthur

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