Сбой функции чтения / уменьшения моего CustomTableViewCell

#ios #swift #uitableview

#iOS #swift #uitableview

Вопрос:

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

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

В этой ячейке у меня есть UILabel, эта UILabel может содержать 140 символов или 4 перехода на строку, если текст внутри метки имеет больше переходов на строку ( n) или длиннее 140 символов, я беру фрагмент и отображаю только этот фрагмент и добавляю текст «… ПОДРОБНЕЕ»; когда пользователь нажимает на текст, метка меняется и показывает весь текст, а в конце добавляет метку «МЕНЬШЕ ЧИТАТЬ», если пользователь снова нажимает на метку, он возвращается в исходное состояние, показывая фрагмент и метку «ПОДРОБНЕЕ» и так далее.

Когда я тестирую это, оно работает на устройстве с 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:

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

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

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

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

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