#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() и помещает полный или фрагмент текста, как соответствует.
наконец, в методе, опубликованном выше, добавлено изменение значения в пути к индексу в массив состояния вместо этого, чтобы изменить все в этом методе