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

iOS开发:RestCountries API国旗图片加载失败,代码问题排查

修复RestCountries API国旗图片加载问题

让我来帮你搞定这个国旗图片不显示的问题,我仔细看了你的代码,找到了几个核心问题,咱们一步步来修复:

1. 最关键的问题:URL拼接错误

RestCountries API返回的flag字段本身就是完整的图片URL(比如https://restcountries.eu/data/chn.svg),你之前的代码把base URL和flag字段硬拼接在一起,导致生成了完全无效的URL(比如http://restcountries.eu/rest/v2/allhttps://restcountries.eu/data/chn.svg),这肯定加载不了图片。

2. 强制解包的风险与空值处理

你代码里用了(countrie?.flag)!和url!这种强制解包操作,不仅可能导致崩溃,还会掩盖空值问题——如果countrie是nil或者flag字段为空,代码会直接跳过加载逻辑,你还找不到原因。

修复后的完整代码

调整DetailsViewController的viewDidLoad方法

import UIKit

class DetailsViewController: UIViewController {
    @IBOutlet weak var alpha3CodeLbl: UILabel!
    @IBOutlet weak var regionLbl: UILabel!
    @IBOutlet weak var flagImage: UIImageView!
    
    var countrie: jsonStruct?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        alpha3CodeLbl.text = countrie?.alpha3Code
        regionLbl.text = countrie?.region
        
        // 1. 安全获取flag的URL字符串,避免强制解包
        guard let flagUrlString = countrie?.flag, 
              let flagUrl = URL(string: flagUrlString) else {
            print("⚠️ 国旗URL无效或countrie对象为空")
            // 可以设置一张占位图,提示用户加载失败
            flagImage.image = UIImage(named: "flag-placeholder")
            return
        }
        
        // 打印URL方便调试,确认是不是正确的图片地址
        print("📝 正在加载国旗:\(flagUrlString)")
        
        // 2. 调用下载方法加载图片
        flagImage.downloadedFrom(url: flagUrl)
    }
}

优化UIImageView扩展(增加错误提示)

extension UIImageView {
    func downloadedFrom(url: URL, contentMode mode: UIViewContentMode = .scaleAspectFit) {
        contentMode = mode
        URLSession.shared.dataTask(with: url) { [weak self] data, response, error in
            // 处理网络请求错误
            if let error = error {
                print("❌ 图片加载失败:\(error.localizedDescription)")
                return
            }
            
            // 验证响应和数据有效性
            guard let httpResponse = response as? HTTPURLResponse,
                  httpResponse.statusCode == 200,
                  let mimeType = response?.mimeType, mimeType.hasPrefix("image"),
                  let data = data,
                  let image = UIImage(data: data) else {
                print("❌ 图片数据无效或响应异常")
                return
            }
            
            // 回到主线程更新UI
            DispatchQueue.main.async {
                self?.image = image
            }
        }.resume()
    }
    
    func downloadedFrom(link: String, contentMode mode: UIViewContentMode = .scaleAspectFit) {
        guard let url = URL(string: link) else {
            print("❌ 无法解析URL:\(link)")
            return
        }
        downloadedFrom(url: url, contentMode: mode)
    }
}

额外注意事项

  • ATS配置:如果API返回的是HTTP协议的URL,iOS默认会阻止这类请求,你需要在Info.plist里添加以下配置(更推荐改用HTTPS,RestCountries现在已经支持HTTPS了):
    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>
    
  • 调试技巧:通过打印flagUrlString,你可以直接复制这个URL到浏览器里打开,确认图片是否能正常访问,这能快速排查是代码问题还是API返回的URL问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:48:44