[英]SwiftUI preview crashes when extending View
我有一个项目需要支持 iOS 的旧版本,我正在尝试使用 SwiftUI 作为一个视图,该视图仅在用户使用 iOS 13 或更高版本时才会出现。 SwiftUI Preview 在 Xcode 中工作得很好,但是当我扩展一个 SwiftUI 结构(例如 View)时,该项目将在设备上编译和运行,但是 Preview Canvas 崩溃,说明它Failed to build myView.swift
。 当我单击“诊断”按钮时,它告诉我'View' is only available in iOS 13.0 or newer
add @available attribute to enclosing extension
中。 但是,有问题的扩展名之前已经有@available(iOS 13.0, *)
。 例如:
@available(iOS 13.0, *)
extension View {
func myFunc() {
}
}
为了找到这个问题的根源,我注意到如果预览完全是空的,它就不会崩溃。 只有在我向其添加 function 或 static 属性后,canvas 才会崩溃。 我还尝试在扩展中的每个 function 之前添加@available
行,重新启动我的计算机,并删除 DerivedData 文件夹,但它似乎没有什么不同。
您不需要@available(iOS 13.0, *)
您的应用程序不会在版本13.0
以下的任何设备上运行,所以基本上错误是说这是多余的。 删除它应该可以解决您的问题。
但是,如果您正在执行 SwiftUI 弱链接并且存在此问题,则它是 xCode 的已知错误。如果没有弱链接,请删除@available(iOS 13.0, *)
编辑:您的链接似乎很弱。
确保SwiftUI.framework
在Build Phases -> Link Binary With Libraries
中设置为optional
确保你的@available(iOS 13.0, *)
在你的body
之上而不是在你的扩展之上
例子:
struct TestView2: View {
@available(iOS 13.0, *)
var body: some View {
Text("test")
}
}
extension TestView2 {
func abc() {
}
}
struct TestView2_Previews: PreviewProvider {
@available(iOS 13.0, *)
static var previews: some View {
TestView2()
}
}
以下代码示例对我来说效果很好。 请注意@available(iOS 13.0, *)
声明属性不仅适用于View
扩展,还适用于:
View
协议的ContentView
结构,和
ContentView_Previews
结构,它符合PreviewProvider
协议。仅供参考:我将 Xcode 项目的部署目标设置为 iOS 12.4 进行测试。
import SwiftUI
@available(iOS 13.0, *)
extension View {
func overlayText<Content>(_ content: Content) -> some View where Content : StringProtocol {
overlay(Text(content))
}
}
@available(iOS 13.0, *)
struct ContentView: View {
static private var initialGreeting = "Hello World!"
static private var greetings: [String] {
[
initialGreeting,
"Hey Everyone!",
"Hi Everybody!",
"Hello Friends!"
]
}
@State private var greeting = initialGreeting
var body: some View {
Button(action: { [greeting] in
while self.greeting == greeting {
self.greeting = Self.greetings.randomElement()!
}
}) {
Color.green
.overlayText(greeting)
.cornerRadius(30)
.padding(5)
}
.background(Color.black)
.frame(height: 50)
.foregroundColor(.white)
.font(.system(size: 28, weight: .bold))
.cornerRadius(30)
.padding()
}
}
@available(iOS 13.0, *)
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.