SwiftUI解码Base64 JSON国旗数据失败 Picker无法显示国旗求助
问题根因
- 条件判断语法错误:你写的
if case country.flag = Data(base64Encoded: flag)属于错误的模式匹配写法,完全没有实现base64数据校验的逻辑 - 数据源传错:你定义的常量
let flag = "flag"是固定字符串"flag",根本不是Country模型里存储的国旗base64字符串,用这个值做解码必然失败 - Picker标签绑定混乱:你分别给Text和Image绑定了不同类型的tag,会导致选中值匹配异常
可直接运行的修复代码
首先删除无用属性let flag = "flag",然后替换视图层的Picker实现:
VStack { Picker(selection: $selectedCountry, label: Text("Host Country:")) { ForEach(countryImage) { country in HStack { Text(country.name) // 直接从当前遍历的country模型取flag字段做base64解码 if let flagData = Data(base64Encoded: country.flag), let flagUIImage = UIImage(data: flagData) { Image(uiImage: flagUIImage) .resizable() .scaledToFit() .frame(width: 20, height: 15) } } // tag统一绑定在HStack根节点,和$selectedCountry的类型完全匹配 .tag(country.name) } } .padding(.horizontal, 0) .padding() .pickerStyle(MenuPickerStyle()) }
你提供的JSON样例里的base64是合法的(已验证可以正常解码出苏丹国旗),改完后不会再打印Fail,国旗可以正常显示。
逻辑解耦复用方案
如果要把图片转换逻辑和View代码解耦,可以给String加扩展封装base64转图片的能力:
extension String { func convertBase64ToUIImage() -> UIImage? { guard let data = Data(base64Encoded: self) else { return nil } return UIImage(data: data) } }
之后视图层代码可以大幅简化,不需要把解码逻辑堆在View里:
HStack { Text(country.name) if let flagImage = country.flag.convertBase64ToUIImage() { Image(uiImage: flagImage) .resizable() .scaledToFit() .frame(width: 20, height: 15) } } .tag(country.name)
你现有的Bundle解码扩展逻辑没有问题,不需要修改。
内容的提问来源于stack exchange,提问作者Bruckner
相关产品推荐
相关产品推荐

