Как определить «настоящую» последнюю ячейку табличного представления? - PullRequest
0 голосов
/ 12 мая 2019

Я пытаюсь скруглить углы первой и последней ячеек таблицы, но у меня возникла проблема. При прокрутке моя последняя повторно используемая ячейка tableView возвращает неправильный indexPath.row. Таким образом, он идет от 0 до 9, так как у меня есть массив с 10 элементами, затем с 6 по 9, затем с 3 по 4. Я пришел к выводу, что это происходит потому, что ячейки используются повторно, но это происходит только при прокрутке. При нажатии на ячейку возвращается правильный indexPath.row, как и ожидалось.

Я пробовал некоторые решения, такие как:

  • Явно возвращает количество ячеек (которое равно 10).
  • Явно проверяю и раздел, но в этом нет необходимости, поскольку у меня всегда есть только один раздел.
  • Обнаружение последней ячейки с помощью "indexPath.row == array.count -1" или "indexPath.row == array.count".

Ни одна из этих работ, особенно последняя. Я ставлю точку останова для проверки на indexPath.row, когда отображается последняя ячейка, и она возвращает «3», а не 9, что я и ожидаю (так как у меня 10 ячеек).

Возвращаемое количество ячеек:

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    guard let resultsCount = results?.count else { return 0 }
    return resultsCount
}

Настройка ячеек:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let customTableViewCell = tableView.dequeueReusableCell(withIdentifier: identifier, for: indexPath) as! CustomTableViewCell

    // Setup stuff
    ...

    if indexPath.row == 0 { // if first cell
        // Do something
        ...
    } else if indexPath.row == results!.count - 1 { // if last cell
        // Do something
        ...
    } else {
        // Do something
        ...
    }

    return searchResultsCell
}

Также пробовал с этим вместо того, чтобы делать это в cellForRowAt:

override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath)

Изображение для иллюстрации

Есть ли другой способ получить реальный indexPath.row последней ячейки при прокрутке, чтобы я мог закруглить ее нижние углы?

Ответы [ 4 ]

2 голосов
/ 12 мая 2019

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

0 голосов
/ 12 мая 2019

Я переделал весь вид, и теперь он работает, как и ожидалось, но, к сожалению, я до сих пор не знаю, что стало причиной проблемы.Возможно, вряд ли ошибка в симуляторе, так как он работал нормально на реальном устройстве: /

0 голосов
/ 12 мая 2019

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

if indexPath.row == 0 {

   cell.yourView.roundCorners(corners: [.topLeft,.topRight], radius: 30)

} else if indexPath.row == totalRow - 1 {

    cell.yourView.roundCorners(corners: [.bottomRight,.bottomLeft], radius: 30)

} else {

    cell.yourView.roundCorners(corners: [.topLeft,.topRight,.bottomRight,.bottomLeft], radius: 0)

}


extension UIView {
    func roundCorners(corners: UIRectCorner, radius: CGFloat) {
        let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
        let mask = CAShapeLayer()
        mask.path = path.cgPath
        layer.mask = mask
    }
}

Надеюсь, что это может помочь вам.

0 голосов
/ 12 мая 2019

Я бы лучше использовал 3 разных идентификатора повторного использования ячеек для верхней, центральной и нижней ячеек.теперь каждая ячейка будет использоваться только для одного из этих случаев.

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