Swift开发笔记

1,tableview点击选中效果,放开点击后选中效果消失。只需重写tableview的delegate方法

@available(iOS 6.0, *)
    public func tableView(_ tableView: UITableView, shouldHighlightRowAt indexPath: IndexPath) -> Bool{
        return true
    }
    
    @available(iOS 2.0, *)
    public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath){
        tableView.cellForRow(at: indexPath)?.isSelected = false
    }

2,使用collectionview时出现错误,使用的是storyboard进行布局,由于多个collectionview使用同一个cell类,第一个collectionview没问题,后面几个都出现如下错误
“terminating with uncaught exception of type NSException”
分析原因时以为是不能复用或者说复用出现了问题,后面发现时storyboard中关联变量出问题了。

image.png

有时候对于布局出现了崩溃,一定先排查下是否在storyboard中这些引用失效了,如果在storyboard中还有关联,但是实际代码中去掉了,就会关联失败导致崩溃。

3,SDWebImage再collectionview的cell中加载图片出现错乱
错乱的原因肯定是reuse造成的,我这边出现这个原因的场景是item可增加和删除,在图片加载的过程总,删除这个item,就会出现删除的item原来要显示的图片显示在别的item上了。解决方案是在item的prepareForReuse中加入以下代码,记得两句都要加,只加第一句有时候解决不了问题

override func prepareForReuse() {
        defaultimg.sd_cancelCurrentImageLoad()
        defaultimg.image = UIImage(named:"edit_avatar_default")
    }

这个地方需要注意的一个坑是如果使用的是kingfish框架加载图片,用同样的处理方式,仍然会有图片错乱。
kingfish框架对这类问题的处理如下:

override func prepareForReuse() {
        background.kf.cancelDownloadTask()
        background.kf.setImage(with: nil)//这句不能少,少了之后也会出现错乱
        background.image = nil
    }

4,计算UILabel的宽度
如果有多个view,放置一行,然后整体居中,对于多语言支持的UILabelview,由于是设置文字之后才知道宽度,所以需要在设置文字后,再通过调整constraints来让view居中
但是在使用nameLabel.frame.width来计算宽度时,发现设置不同的text返回的长度还是一样的。实际上应该是用

nameLabel.intrinsicContentSize.width

这句代码应该是在设置完了text之后调用。