如何在Xcode 15中为带@Binding的SwiftUI视图创建#Preview
如何在Xcode 15的#Preview中预览带@Binding的SwiftUI视图
当你尝试在Xcode 15的#Preview闭包中直接声明@State属性来为@Binding视图提供预览数据时,会触发Ambiguous use of 'Preview(_:traits:body:)'报错——这是因为#Preview的顶层闭包不具备ViewBuilder特性,无法直接处理「属性声明+视图返回」的组合语句。
解决方法1:使用临时包装视图
将@State属性封装在一个临时的内部View结构体中,再返回该结构体的实例:
#Preview { struct PreviewContainer: View { @State private var isActive = true var body: some View { SpecialButton(isOn: $isActive) } } PreviewContainer() }
解决方法2:使用匿名View包装
更简洁的写法是直接用View的闭包形式包裹状态和目标视图,借助ViewBuilder处理内部的属性声明:
#Preview { View { @State private var isActive = true SpecialButton(isOn: $isActive) } }
原理说明
旧的PreviewProvider模式中,static var previews: some View的闭包是ViewBuilder类型,允许直接在其中声明@State并返回视图;而#Preview的顶层闭包默认要求返回单个View实例,直接写属性声明会让编译器无法推断正确的返回类型,从而产生歧义。通过将状态封装在View内部,就能借助ViewBuilder的特性正确解析@State声明和视图结构。
内容的提问来源于stack exchange,提问作者de.
相关产品推荐
相关产品推荐

