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
相关产品推荐
相关产品推荐

