我的CustomTableViewCell读取更多/更少的功能崩溃

时间:2016-10-03 20:40:16

标签: ios swift uitableview

感谢您的关注。

我有一个使用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)
    }
}

1 个答案:

答案 0 :(得分:0)

我已经有一种方法可以避免这种情况。在IOS 9及更早版本中,该代码没有问题;但是在iOS 10中有不同的。

在文档中,apple说每次在屏幕上显示该单元格的单元格时,都会调用委托方法tableView cellForRowAtIndexPath。在旧版本的IOS中,似乎是一个使这种情况不起作用的错误,让我们在刷新单元格之后修改此方法之外的视图whitout回调cellForRowAtIndexPath。

我添加了一个Bool值数组,表示标签的状态(如果它有标签的扩展或缩小值)并在我的JSON接收方法的ItemsDownload方法上初始化它

我添加一个条件来计算cellForRowAtIndexPath()中stateArray中的值,并将文本的全部或片段放在对应的位置。

最后,在上面发布的方法中,将索引路径上的值更改添加到状态数组,而不是更改该方法中的所有内容