【问题标题】:Cannot use custom view in SwiftUI无法在 SwiftUI 中使用自定义视图
【发布时间】:2019-10-21 16:33:26
【问题描述】:

对于我的 SwiftUI 应用程序,我创建了一个简单的 Title 视图,它具有设置的字体大小和文本颜色。 Title 声明如下:

struct Title: View {
    var string: String
    
    var body: some View {
        Text(string)
            .font(.system(size: 32))
            .color(Color.black)
    }
}

我的内容视图的正文中现在有以下文本对象:

var body: some View {
    VStack(alignment: .leading) {
        Text("Welcome")
            .font(.largeTitle)
            .color(Color.black)
        Text("to SwiftUI")
            .font(.largeTitle)
            .color(Color.secondary)
    }
}

所以现在,我想用我的Titles 替换这两个Texts:

var body: some View {
    VStack(alignment: .leading) {
        Title("Welcome")
        Title("to SwiftUI")
    }
}

替换视图后,我从 Xcode 收到一些看似无关的错误消息,导致应用程序无法编译:

静态成员“leading”不能用于“Horizo​​ntalAlignment”类型的实例

'(LocalizedStringKey) -> Text' 不能转换为 '(LocalizedStringKey, String?, Bundle?, StaticString?) -> Text'

“字体”不能转换为“字体?”

...等等。恢复为 Text 而不是 Title “修复”了这些问题。

有趣的是,我还有一个自定义的 PrimaryButton 视图,我可以毫无问题地添加它:

struct PrimaryButton: View {
    var title: String
    
    var body: some View {
        Button(action: { print("tapped") }) {
            Text(title)
                .font(Font.primaryButton)
                .offset(y: 1)
                .padding(.horizontal, 20)
                .padding(.vertical, 14)
        }
    }
}

...然后使用它:

PrimaryButton(title: "Let's go")

问题

这只是一个测试版问题,还是我遗漏了什么?

【问题讨论】:

    标签: swift swiftui


    【解决方案1】:

    今天,2019 年 10 月 1 日,Swift 提示我将 string: 替换为。 verbatim:.

    Text(verbatim: "Pressure") 今天工作 Text(string: "Pressure") 昨天有效,但今天无效。 hth

    【讨论】:

      【解决方案2】:

      您需要将 string: 添加到您的 Title() 初始化程序中:

      var body: some View {
          VStack(alignment: .leading) {
              Title(string: "Welcome")
              Title(string: "to SwiftUI")
          }
      }
      

      编译器错误目前具有误导性,并且不在真正问题所在的位置附近。

      【讨论】:

      • 啊,我没发现,谢谢!为了省略它,我是否必须编写自定义初始化程序?
      • 创建时需要为所有结构值提供值,但不必显式编写自定义初始化程序。但是从 Swift 5.1(我相信)开始,您只需为那些未使用默认值初始化的成员提供值。
      【解决方案3】:

      您在初始化程序中缺少 string: 参数。 请在下面找到更新的代码:

      var body: some View {
          VStack(alignment: .leading) {
              Title(string: "Welcome")
              Title(string: "to SwiftUI")
          }
      }
      

      仅供参考:
      我创建了一个示例应用程序

      // MARK - CustomView
      
      struct ContentView : View {
          var body: some View {
              VStack{
                  CustomView(aString: "First String")
                  CustomView(aString: "Second String")
              }
          }
      }
      
      // MARK - CustomView
      
      struct CustomView : View {
          var aString: String
          var body: some View {
              Text(aString)
          }
      }
      

      【讨论】:

      • 是否可以使用TextField 而不是Text 视图做同样的事情?如何从使用它的视图中获取 @State var 的 TextField 的值?
      • 你能分享你的示例应用程序的链接吗
      猜你喜欢
      • 1970-01-01
      • 2022-01-21
      • 2021-03-08
      • 2020-03-09
      • 1970-01-01
      • 1970-01-01
      • 2021-06-04
      • 2018-07-11
      • 1970-01-01
      相关资源
      最近更新 更多