Сбой функции read more/less в My CustomTableViewCell

Спасибо за внимание.

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

В этой ячейке у меня есть UILabel, этот UILabel может иметь 140 символов или 4 прыжка строки, если текст внутри метки имеет больше прыжков строки (n) или длиннее 140 символов, я беру фрагмент и только отображаю этот фрагмент и добавляю текст «… READ MORE»; когда пользователь нажимает на текст, метка изменяется и показывает весь текст, а в конце добавляет метку «READ LESS», если пользователь нажимает снова метку, он возвращается в исходное состояние, показывая фрагмент и метку «READ MORE» И так далее.

Когда я тестирую это, он работает на устройстве с iOS9, но в устройствах с iOS 10 (включая симуляторы) он перестает работать; кажется, что когда я нажимаю на метку, метка изменяется как обычно, но сразу возвращается к своей первоначальной форме. Я регистрирую только один кран.

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

func cellTextPressed(gesture: UITapGestureRecognizer){

    let cell: TimeLineViewCell = gesture.view?.superview?.superview as! TimeLineViewCell
    let tappedIndexPath: NSIndexPath = self.timelineTableView.indexPathForCell(cell)!
    NSLog ("Text Tapped at:  (tappedIndexPath)")
    if ((cell.isReasonExpanded) == true)
    {
        cell.isReasonExpanded = false

        let attrs = [NSForegroundColorAttributeName: UIColor.magentaColor()]
        let attributedReducedText = NSMutableAttributedString(string: cell.reducedReason)
        attributedReducedText.appendAttributedString(NSAttributedString(string: "... "))
        attributedReducedText.appendAttributedString(NSAttributedString(string: "READ MORE", attributes: attrs))
        cell.labelReason.attributedText = attributedReducedText

    }
    else
    {
        cell.isReasonExpanded = true

        let attrs = [NSForegroundColorAttributeName: UIColor.magentaColor()]

        let attributedRealText = NSMutableAttributedString(string: cell.realReason)
        attributedRealText.appendAttributedString(NSAttributedString(string: "    "))
        attributedRealText.appendAttributedString(NSAttributedString(string: "READ LESS", attributes: attrs))
        cell.labelReason.attributedText = attributedRealText
    }
    let lastScrollOffset = self.timelineTableView.contentOffset
    UIView.performWithoutAnimation
        {
            self.timelineTableView.beginUpdates()
            self.timelineTableView.endUpdates()
            self.timelineTableView.layer.removeAllAnimations()
            self.timelineTableView.setContentOffset(lastScrollOffset, animated: false)
    }
}

1 ответ

  1. У меня уже есть способ избежать этого.В IOS 9 и более старых версиях нет проблем с этим кодом; но в iOS 10 есть разные.

    В документации apple говорит, что делегат метод tableView cellForRowAtIndexPath вызывается каждый раз, когда ячейка отображается на экране, для этой ячейки. В более старых версиях IOS, кажется, ошибка, которая делает эту ситуацию не работает, Давайте изменим представление вне этого метода whitout обратного вызова cellForRowAtIndexPath после обновления ячейки.

    Я добавил массив значений Bool, который представляет состояние меток (если он имеет расширенное или сжатое значение метки) и инициализирует его в методе ItemsDownload метода my JSON receiver

    Я добавляю условие, которое оценивает значение в этом stateArray в cellForRowAtIndexPath () и помещаю полный или фрагмент текста как соответствующий.

    наконец, в методе, опубликованном выше, добавлено изменение значения в пути индекса к массиву состояния вместо того, чтобы изменить все в этом методе