2015-09-21 4 views
0

Я относительно не знаком с Swift и iOS, и у меня есть одна проблема. У меня есть собственный класс SwipeCell, который расширяет UITableViewCell. Это ячейка, которая может быть сдвинута влево и вправо и имеет кнопки с каждой стороны. По какой-то причине, если я сделал кнопки из фрейма ячейки, когда пользователь вытащил ячейку, они появятся, но не смогут вызвать действие, поэтому мое решение состояло в том, чтобы сделать ячейку более широкой, чем она есть (поэтому в нее могут входить кнопки). Поскольку это было сделано таким образом, моя ячейка должна иметь смещение по умолчанию для общей ширины кнопок слева (скажем, 100), поэтому это позиция X: -100.deleteRowsAtIndexPaths сбрасывает пользовательские ячейки

И это нормально, и все работает штрафы с клетками, однако есть одна огромная проблема - если я вызываю удаление любой клетки из Tableview как этот

tableView.deleteRowsAtIndexPaths([tableView.indexPathForCell(activeCell)!], withRowAnimation: .None) 

Tableview затем удаляет клетки, и все остальные ячейки, которые в настоящее время видны (не происходит с ячейками выше или ниже границ экрана), перемещаются в X: 0 вместо того, чтобы оставаться на X: -100, поэтому я предполагаю, что deleteRowsAtIndexPaths вызывает некоторую функцию, которая сбрасывает видимые ячейки позиции до 0,0. В настоящее время я устанавливаю позиции ярлыков ячеек с layoutSubviews(), поскольку количество кнопок является динамическим и не может быть определено заранее, но layoutSubviews не является функцией, в которой происходит ошибка.

Итак, чтобы подвести итог вопроса - какая функция deleteRowsAtIndexPaths вызывает после удаления ячейки, которая сбрасывает/перерисовывает видимые ячейки?

ответ

0

Поскольку я мог узнать, что происходит внутри deleteRowAtIndexPaths, и почему он меняет кадры каждой ячейки, я решил просто выполнить свою собственную функцию, которая удаляет строку, получая ячейки с помощью tableView.visibleCells, а затем просто перемещая ячейки ниже удаленная ячейка вверх высотой удаленной ячейки. Спасибо всем за то, что вы помогли мне, и особенно благодаря Абхинаву, который сказал мне, что он обрабатывается внутри страны, что помогает мне решить написать собственный код для удаления.

1

deleteRowsAtIndexPaths удаляет строки из таблицыView. Это обрабатывается внутри iOS. Из Apple documentation:

Удаляет строки, указанные в массив индексных путей, с возможностью анимировать удаления.

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

+0

Не уверен, что вы меня поняли - у меня нет проблем с повторным появлением ячейки, ячейка исчезает, но все остальные ячейки меняются (deleteRowsAtIndexPaths по какой-то причине изменяет свой кадр на один размер, но 0,0 координаты вместо -100,0, где они были). Поэтому проблема заключается в том, что deleteRowsAtIndexPaths на самом деле вызывает какой-то метод или перемещает кадр сам по себе. – n1tr0

+0

Я ответил, что в моей первой строке. Это внутренняя структура iOS. – Abhinav

+0

Я понимаю, что он влияет на удаляемую ячейку и что он перемещает ячейки ниже, но почему это влияет на другие ячейки (например, выше) и почему они будут перемещать их по оси X? Возможно ли, что он не вызывает некоторую функцию, например layoutSubviews, как только это произойдет в элементе UIView (в частности, UITableViewCell)? – n1tr0

0

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

+0

Что вы написали, что связано с моим вопросом? Я создал собственный SwipeCell, который расширяет UITableViewCell и переопределяет функцию layoutSubviews(), а внутри нее вызывает super.layoutSubviews(), а затем добавляет пользовательскую кнопку после этого (если они еще не представлены, поскольку layoutSubviews могут быть вызваны существующая ячейка). Проблема здесь в том, что layoutSubviews вызывается для других видимых ячеек, когда одна ячейка была удалена, и она устанавливает положение X каждой ячейки на -100, но по какой-то причине что-то вызывается потом (в самом ядре), которое перемещает ячейки X в 0. – n1tr0

+0

Итак, мой вопрос заключается в удалении, есть ли что-то другое, которое вызывается, кроме layoutSubviews для видимых ячеек? – n1tr0

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