You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

异步调用加载完成后如何重绘UIView?相关实现失效问题咨询

解决自定义UIView重绘不生效的问题

嘿,我来帮你排查这个自定义视图重绘失效的问题!这种情况我在项目里碰到过好几次,咱们一步步拆解可能的原因:

1. 计算属性的逻辑可能有问题

你提到用了计算属性来触发重绘,但如果你的计算属性是只读的(只有get方法),那当你从ViewController给它赋值时,根本不会触发任何逻辑,自然也不会调用setNeedsDisplay()。

举个反例,这种写法肯定不行:

// 错误示例:只读计算属性,赋值不会触发任何操作
var downloadData: Data {
    get {
        // 你的获取逻辑
    }
}

改成下面两种方式之一:

  • 存储属性 + didSet(推荐,逻辑更清晰):

var downloadData: Data? {
didSet {
// 属性更新时立即标记需要重绘
setNeedsDisplay()
}
}

- **带setter的计算属性**(如果必须用计算属性的话):
  ```swift
var downloadData: Data? {
    get {
        // 你的获取逻辑
    }
    set {
        // 你的设置逻辑,比如更新内部存储的变量
        self.internalData = newValue
        // 标记重绘
        setNeedsDisplay()
    }
}

2. 确认网络请求后确实切换到了主队列

UI相关的操作(包括调用setNeedsDisplay())必须在主队列执行。如果你的网络请求回调不在主队列,一定要手动切回去:

// 正确的网络请求回调写法
URLSession.shared.dataTask(with: yourRequestURL) { data, response, error in
    guard let validData = data, error == nil else {
        // 处理错误
        return
    }
    
    // 必须切到主队列更新UI
    DispatchQueue.main.async {
        self.customOutletView.downloadData = validData
    }
}.resume()

3. 检查draw(_ rect: CGRect)方法是否正确使用了最新属性

就算调用了setNeedsDisplay(),如果你的draw方法里没有用最新的downloadData来绘制内容,那视图也不会有变化。比如要确保在绘制时直接使用当前的属性值,而不是初始化时的旧数据:

override func draw(_ rect: CGRect) {
    super.draw(rect)
    
    guard let data = downloadData else {
        // 没有数据时可以绘制占位内容
        UIColor.lightGray.setFill()
        rect.fill()
        return
    }
    
    // 根据data执行绘制逻辑,比如转成图片绘制
    if let image = UIImage(data: data) {
        image.draw(in: rect.insetBy(dx: 10, dy: 10))
    }
}

4. 排查视图连接和布局问题

  • 确认你的outlet已经正确连接:在ViewController里打印customOutletView,如果输出nil,说明outlet没连上,重新在Storyboard/XIB里绑定即可。
  • 检查视图的frame是否有效:如果视图的frame是CGRectZero(宽高都是0),draw方法也不会被调用。可以用AutoLayout给视图设置明确的约束,或者手动设置frame。

总结

最常见的坑就是计算属性没触发重绘逻辑或者draw方法没用到最新数据,先从这两点入手排查,再确认队列和视图连接的问题,应该就能解决啦!

内容的提问来源于stack exchange,提问作者GarySabo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 06:17:55