【问题标题】:SwiftUI View and Swift Package ManagerSwiftUI 视图和 Swift 包管理器
【发布时间】:2020-01-08 14:58:03
【问题描述】:

我正在尝试创建一个基本上是单个 SwiftUI 视图的 Swift 包。我在这里创建了一个示例来显示正在发生的事情。打包的功能无关紧要,我只是在视图中包含了一些@State 和@Binding 变量,这样我得到的错误与我在真实包中遇到的错误相同。 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)
    }
}

当我添加包并将其导入项目中的一个视图时,我应该能够使用 Do something like this as I can do if the View is not a Swift Package:

 SampleView(myNum: $myNum,
             fixedText: parentText,
             myText: "Display Text Passed from parent")

但是,我没有得到代码完成并且我得到了错误:

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

我在 SampeView 结构上尝试了各种初始化,但不断收到各种不同的错误。我只是不明白如何在这里修复访问级别。任何人都可以帮忙吗?截图也在这里。

【问题讨论】:

    标签: swiftui swift-package-manager


    【解决方案1】:

    这是 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")
    }
    

    【讨论】:

    • 谢谢,它有帮助。但是,如果 UI 组件在单独的包中,如何使它们的预览工作?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    • 1970-01-01
    • 2017-05-22
    • 2019-04-21
    • 1970-01-01
    • 1970-01-01
    • 2020-08-11
    相关资源
    最近更新 更多