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

咨询:Navigation Bar无法动态加载并显示图片的问题

导航栏动态显示图片失败的排查原因及修复
  • URL无效或图片加载失败
    currentFirma?.goruntuUrl可能为空字符串,或者转换为URL对象失败,导致SDWebImage无法加载图片。可以在回调中检查image是否为nil,同时打印URL(string: currentFirma?.goruntuUrl ?? "")确认地址是否有效。

  • 新创建的UIImageView未设置布局属性
    回调里直接创建的UIImageView(image: image)没有设置frame和contentMode,图片尺寸可能超出导航栏显示范围,或者因没有固定尺寸导致无法正常显示。你之前已经创建并配置好布局的imageView没有被使用,而是新建了一个未配置的实例。

  • titleView设置对象错误
    使用navigationController?.navigationBar.topItem?.titleView不够可靠,当导航栈有多个控制器时,topItem可能指向其他控制器的导航项。应该直接使用当前控制器的navigationItem.titleView,确保设置的是当前页面的导航栏标题视图。

  • 异步回调中控制器状态变化
    SDWebImage的图片加载是异步操作,如果在回调执行前当前控制器已经被弹出导航栈,self.navigationController会变为nil,导致无法设置titleView。


修复后的代码示例

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    
    guard let imageUrlString = currentFirma?.goruntuUrl, let imageUrl = URL(string: imageUrlString) else {
        // 处理URL为空或无效的情况,比如设置默认图片
        let placeholderImageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 40, height: 20))
        placeholderImageView.contentMode = .scaleAspectFill
        placeholderImageView.image = UIImage(named: "placeholder")
        navigationItem.titleView = placeholderImageView
        return
    }
    
    let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 40, height: 20))
    imageView.contentMode = .scaleAspectFill
    
    imageView.sd_setImage(with: imageUrl) { [weak self] image, error, _, _ in
        guard let self = self else { return }
        if let loadedImage = image {
            imageView.image = loadedImage
            self.navigationItem.titleView = imageView
        } else {
            // 加载失败时设置默认图
            imageView.image = UIImage(named: "placeholder")
            self.navigationItem.titleView = imageView
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 13:07:11