感谢您的关注。
我有一个使用UITableView作为显示某些事件的时间线的应用程序,Cell原型有点复杂,因为我使用多个标签,一个按钮和一些自动更改其他字段内容功能的imageViews。 / p>
在那个单元格中,我有一个UILabel,这个UILabel可以有140个字符或4个行跳转,如果标签内的文字有更多的行跳转(\ n)或者更长的140个字符,我只取一个片段而且只有显示该片段并添加文本" ...阅读更多&#34 ;;当用户点击文本时,标签会更改并显示所有文本,并在最后添加标签" 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)
}
}
答案 0 :(得分:0)
我已经有一种方法可以避免这种情况。在IOS 9及更早版本中,该代码没有问题;但是在iOS 10中有不同的。
在文档中,apple说每次在屏幕上显示该单元格的单元格时,都会调用委托方法tableView cellForRowAtIndexPath。在旧版本的IOS中,似乎是一个使这种情况不起作用的错误,让我们在刷新单元格之后修改此方法之外的视图whitout回调cellForRowAtIndexPath。
我添加了一个Bool值数组,表示标签的状态(如果它有标签的扩展或缩小值)并在我的JSON接收方法的ItemsDownload方法上初始化它
我添加一个条件来计算cellForRowAtIndexPath()中stateArray中的值,并将文本的全部或片段放在对应的位置。
最后,在上面发布的方法中,将索引路径上的值更改添加到状态数组,而不是更改该方法中的所有内容