SwiftUI 将带Image插值的字符串传入Text视图不显示图片如何解决
问题根因
你将带Image插值的内容转为普通String类型传入子视图时,普通String无法存储SwiftUI的Image实例信息,只会调用Image的description方法输出对象描述文本,所以渲染异常。而直接写在Text内的插值用的是SwiftUI专属的LocalizedStringKey类型的插值规则,支持Image、Date等类型的富内容渲染。
另外你子视图中对label加@State是错误用法,@State仅用于视图内部私有可变状态,外部传入的常量参数直接用let声明即可。
解决方案
下面提供两种最常用的修复方案:
方案1:子视图接收LocalizedStringKey类型参数(改动最小,调用写法完全不变)
修改subView的label类型为LocalizedStringKey即可,示例代码:
import SwiftUI struct UserMediaCell: View { var body: some View { SubView(label: "\(Image(systemName: "ellipsis"))") // 现在可以正常显示SF Symbol Text("\(Image(systemName: "ellipsis"))") } } // 注意首字母大写,符合Swift视图命名规范 struct SubView: View { // 把String改为LocalizedStringKey,删除多余的@State let label: LocalizedStringKey var body: some View { Text(label) } }
方案2:子视图直接接收Text类型参数(灵活度更高,支持提前配置Text样式)
如果需要在外部自定义Text的样式、或者传入更复杂的富文本组合,可以直接传Text实例:
struct SubView: View { let label: Text var body: some View { label .font(.body) .foregroundColor(.primary) // 可以在这里统一加通用的Text修饰符 } } // 调用示例 SubView(label: Text("\(Image(systemName: "ellipsis")) 更多操作") .font(.callout) .foregroundColor(.secondary))
内容的提问来源于stack exchange,提问作者Satoru Sakamoto
相关产品推荐
相关产品推荐

