繁体   English   中英

SwiftUI 扩展视图时预览崩溃

[英]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, *)

编辑:您的链接似乎很弱。

  1. 确保SwiftUI.frameworkBuild Phases -> Link Binary With Libraries中设置为optional

  2. 确保你的@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扩展,适用于:

  1. 符合View协议的ContentView结构,

  1. 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM