быстрый выбор блока пользовательской ячейки заголовка раздела - PullRequest
0 голосов
/ 29 апреля 2018

У меня есть UITableView с настраиваемыми заголовками разделов, созданными через раскадровку с использованием настраиваемой ячейки прототипа с идентификатором «headerCell», а также с классом касания Какао, называемым «HeaderViewCell», подклассом UITableViewCell.

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let headerCell = tableView.dequeueReusableCell(withIdentifier: "headerCell") as! HeaderViewCell

    headerCell.sectionTitle.text = viewModel.items[section].sectionTitle
    headerCell.section = section
    headerCell.delegate = self

    return headerCell
}

Кнопка в ячейке запускает функцию делегата, проходящую в назначенный ей раздел.

Все отлично работает - установка заголовка, нажатие на нужную мне кнопку и т. Д. ... ЗА исключением случаев, когда вы нажимаете пустое пространство между заголовком раздела (слева) и кнопкой (справа), выделяется заголовок раздела как будто это ячейка в разделе, а затем выполняет переход для первой строки в разделе.

Выбор установлен на «Нет» в инспекторе атрибутов. Если я включаю взаимодействие с пользователем, то кнопка не работает.

Я нашел много постов, в которых люди пытаются регистрировать нажатия на заголовки разделов (ответ: с помощью жестов), но я исчерпал себя в поисках того, как их заблокировать. В методе didSelectRow at Delegate я вижу тот же IndexPath, который я бы использовал, как если бы я щелкал по строке, а не по заголовку, поэтому я не могу заблокировать ее оттуда.

Поскольку использование настраиваемой ячейки прототипа является наиболее широко рекомендуемым ответом на настраиваемый заголовок раздела, я ожидал, что это будет проблемой и для кого-то еще.

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Ответ Мэтта должен работать.

Создайте подкласс типа UITableViewHeaderFooterView и назовите его CustomHeaderView

class CustomHeaderView: UITableViewHeaderFooterView {
   // programmatically add the sectionTitle and whatever else inside here. Matt said there isn’t a storyboard or nib for a HeaderFooterView so do it programmatically
}

Затем внутри viewForHeaderInSection используйте tableView.dequeueReusableHeaderFooterView и приведите его как CustomHeaderView

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

    // don't forget to rename the identifier 
    let customHeaderView = tableView.dequeueReusableHeaderFooterView(withIdentifier: "customHeaderView") as! CustomHeaderView

    customHeaderView.sectionTitle.text = viewModel.items[section].sectionTitle
    customHeaderView.section = section
    customHeaderView.delegate = self

    return customHeaderView
}

Если нет, попробуйте это.

Если вы не хотите, чтобы ячейка подсвечивалась, сначала установите стиль выделения на .none:

Либо установить .selectionStyle = .none внутри самой HeaderCell

или

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let headerCell = tableView.dequeueReusableCell(withIdentifier: "headerCell") as! HeaderViewCell

    headerCell.sectionTitle.text = viewModel.items[section].sectionTitle
    headerCell.section = section
    headerCell.delegate = self
    headerCell.selectionStyle = .none // set it here

    return headerCell
}

Затем в didSelectRowAtIndexPath выясните тип ячейки, которая выбирается. Если это HeaderCell, тогда просто return, и ячейка не должна выдвигаться. Если это какой-либо другой тип ячеек (например, PushCell), то эти ячейки должны выполнить переход:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    // if it's a HeaderCell then do nothing but print
    if let _ = tableView.cellForRowAtIndexPath(indexPath) as? HeaderCell {
        tableView.deselectRow(at: indexPath, animated: true)
        print("+++++HeaderCell was tapped")
        return // nothing should happen
    }

    // if it's a PushCell then push
    if let _ = tableView.cellForRowAtIndexPath(indexPath) as? PushCell {
        print("-----PushCell was tapped")
        performSegue(withIdentifier...
        // or if your using navigationController?.pushViewController(...
    }
}
0 голосов
/ 29 апреля 2018

Подкласс "HeaderViewCell" UITableViewCell.

Стоп. Это совершенно неправильно. Заголовок вашего раздела не должен быть UITableViewCell. Это должен быть UITableViewHeaderFooterView (или его подкласс).

Как только вы сделаете это изменение (вместе с необходимыми соответствующими изменениями в регистрации типа представления заголовка), ваша проблема исчезнет.

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