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

Я столкнулся с необычной ошибкой с моим tableViewHeader на моем UITableView в iOS 8. При прокрутке на ячейке, чтобы открыть кнопку удаления (стандартная прошивка iOS для удаления), она перемещает tableViewHeader вдоль с клеткой, которая выкачивается. Когда я прокручиваю ячейку, заголовок движется так же, как и проводящая ячейка. Никакие другие ячейки в представлении таблицы не перемещаются, а только заголовок и всякая ячейка прокручиваются. Я тестировал это на iOS 7, не столкнулся с этой проблемой. Для меня это похоже на ошибку с tableViewHeader в iOS 8, поскольку это происходит только в этой версии и похоже на то, что никогда не должно происходить. Я не вижу причин, по которым заголовок никогда не включался в салфетки для удаления.

Ниже представлен только макет. Прокрутка для удаления в приложении по умолчанию - iOS, ничего нестандартное.

Below is just a mockup. Swipe-to-delete within the app is default iOS, nothing custom.

Ответ 1

Основываясь на ответе ферриса, я нашел самый простой способ использования UITableViewCell в качестве заголовка раздела, чтобы вернуть contentView ячейки в viewForHeaderInSection. Код выглядит следующим образом:

override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let  cell : cellSectionHeader = tableView.dequeueReusableCellWithIdentifier("SectionHeader") as cellSectionHeader
    return cell.contentView
    //cellSectionHeader is my subclassed UITableViewCell
}

Ответ 2

Это было вызвано тем, что я использовал UITableViewCell в качестве заголовка для таблицы. Чтобы решить проблему очистки, вместо использования tableView.tableHeaderView = cell, я использую следующее:

UIView *cellView = [[UIView alloc] init];
[cellView addSubview:cell];
tableView.tableHeaderView = cellView

Я не знаю, почему это решает проблему, особенно если она работает на iOS 7, но, похоже, она решает проблему.

Обязательно добавьте все представления в представление ячеек, как это предполагается в ячейках contentView, иначе кнопки не будут реагировать.

Работает:

[cell addSubview:view]; или [self addSubview:view];

Не работает:

[cell.contentView addSubview:view] или [self.contentView addSubview:view]

Ответ 3

Способ избежать заголовков, перемещающихся с помощью ячеек, состоит в том, чтобы вернуть contentView ячейки в viewForHeaderInSection. Если у вас есть подклассы UITableViewCell с именем SectionHeaderTableViewCell, это правильный код:

-(UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    SectionHeaderTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SectionHeader"];
    //Do stuff to configure your cell
    return cell.contentView; 
}

Ответ 4

SWIFT 3.0 Проверено решение. Как упоминалось в первом примере для Objective-C; ключевой момент возвращает cell.contentView вместо cell. Таким образом, новый синтаксис формата выглядит следующим образом.

override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

    // HeaderCell is the name of custom row designed in Storyboard->tableview->cell prototype
    let cell = tableView.dequeueReusableCell(withIdentifier: "HeaderCell")

    cell.songLabel.text = "Your Section Name"
    return cell.contentView
}

Ответ 5

Попробуйте реализовать этот метод и дайте правильные условия для проверки swipe.If этот метод вызывается для представления заголовка.

1.tableView: editingStyleForRowAtIndexPath: 2.tableView: titleForDeleteConfirmationButtonForRowAtIndexPath: 3.tableView: shouldIndentWhileEditingRowAtIndexPath:

Ответ 6

Одна из проблем, не упомянутых в методе .contentView, заключается в том, что если ваша ячейка представления таблицы использует layoutSubviews, вы можете не получить требуемое поведение, потому что макеты не будут вызваны. Я закончил создание полностью отдельного подкласса UIView, который поддерживает как нормальную работу ячейки, так и работу с заголовком, и создавая минимальный класс ячеек UITableView, который использует это.

Ответ 7

Вопрос Виктора о потере цвета фона, решается путем добавления к Брэду ответа:

cell.backgroundColor = UIColor.cyanColor()

To:

cell.contentView.backgroundColor = UIColor.cyanColor()

Ответ 8

Если после добавления cell.contentView раздел становится пустым, вам нужно перейти к инспектору свойств и убедиться, что класс универсального размера проверен (где он говорит "установлен" ). Скорее всего, вы используете wRhR или что-то в этом роде. Вы должны пройти через каждый элемент и ограничение таблицы и поставить галочку в установленном флажке.