SwiftUI 视图和 Swift 包管理器

5

我试图创建一个Swift Package,它基本上是一个单一的SwiftUI视图。我在此处创建了一个示例来展示正在发生的事情。包的功能并不重要,我只是在View中包含了一些@State和@Binding变量,以便我能够获得与我的真实Package相同的错误。 View结构如下。

import SwiftUI

public struct SampleView: View {
    @Binding var myNum:Int
    @State var fixedText:String = ""
    var myText = ""
    var optional: String?


   public  var body: some View {
        VStack {
            if optional != nil {
                Text(optional!)
            }
            Text(myText)
            Text("Parent number: \(myNum)")
            Text("\(fixedText)")
            Button("Increment num") {
                self.myNum += 1
            }.foregroundColor(.blue)
            Button("Change Parent Text") {
                self.fixedText = "Only Changes Child"
            }.foregroundColor(.blue)
        }.background(Color.red)
            .foregroundColor(.white)
    }
}

当我将包添加并导入到我的项目中的一个视图中时,我应该能够像在不包含Swift Package的情况下一样使用“这样做”(Do something like this)。
 SampleView(myNum: $myNum,
             fixedText: parentText,
             myText: "Display Text Passed from parent")

然而,我没有代码自动补全功能,而且出现了以下错误:

'SampleView' initializer is inaccessible due to 'internal' protection level

我尝试了各种SampeView结构体的初始化方式,但一直遇到各种不同的错误。我不理解如何修复这里的访问级别问题。有人可以帮忙吗?此处也附有截图。 enter image description here

1个回答

10

下面是Package中预期的声明(使用Xcode 11.2.1/iOS 13.2.2进行测试)。请注意,@State不能在View之外使用,因此您需要通过Binding传递所有需要同步的内容:

public struct SampleView: View {
    @Binding var myNum:Int
    @Binding var fixedText:String
    var myText: String
    var optional: String?

    public init(myNum: Binding<Int>, fixedText: Binding<String>, 
                myText: String = "", optional: String? = nil) {
        self._myNum = myNum
        self._fixedText = fixedText
        self.myText = myText
        self.optional = optional
    }
    
    public var body: some View {
        VStack {
            if optional != nil {
                Text(optional!)
            }
            Text(myText)
            Text("Parent number: \(myNum)")
            Text("\(fixedText)")
            Button("Increment num") {
                self.myNum += 1
            }.foregroundColor(.blue)
            Button("Change Parent Text") {
                self.fixedText = "Only Changes Child"
            }.foregroundColor(.blue)
        }.background(Color.red)
            .foregroundColor(.white)
    }
}

及其用法:

@State private var myNum: Int = 1
@State private var parentText = "Test"
var body: some View {
    SampleView(myNum: $myNum,
               fixedText: $parentText,
               myText: "Display Text Passed from parent")
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接