【问题标题】:How can I assign value of some View to type View in SwiftUI?如何在 SwiftUI 中分配某些视图的值以键入视图?
【发布时间】:2021-05-25 17:52:21
【问题描述】:

我有一个简单的View叫做TextViewTextView的类型自然是View,我想对TextView进行修改 喜欢 .foregroundColor(Color.red) 并再次将其替换为自身!据我了解,我的 TextView 是 View 类型,应该可以正常工作,因为该类型不是 Text 但我也理解 SwiftUI 的抱怨,它说不能为 some 赋值查看 键入查看。我喜欢为解决问题做一些修正,我也不想添加另一个初始化器作为 foregroundColor

import SwiftUI

struct ContentView: View {
    
   @State private var myTextView: TextView?
    
    var body: some View {

        if let unwrappedMyTextView = myTextView {
            
            unwrappedMyTextView
            
        }
        
        Button ("update") {
            
            myTextView = TextView(stringOfText: "Hello, world!")//.foregroundColor(Color.red)
        }
        .padding()
        
    }
}

struct TextView: View {

    let stringOfText: String
    
    init(stringOfText: String) {
        self.stringOfText = stringOfText
    }

    var body: some View {

        return Text(stringOfText)
        
    }
 
}

【问题讨论】:

  • 为什么不这样使用呢? if let unwrappedMyTextView = myTextView { unwrappedMyTextView.foregroundColor(Color.red) }
  • 谢谢,有很多方法,我的意思是替换或更新,不完全给出红色前景颜色
  • 然后可以在颜色函数中添加条件。这不是用@State 替换整个视图的好方法。

标签: swiftui


【解决方案1】:

问题是foregroundColor 没有返回TextView

@inlinable public func foregroundColor(_ color: Color?) -> some View

这意味着

myTextView = TextView(stringOfText: "Hello, world!").foregroundColor(Color.red)

不再是TextView,而是应用foregroundColor的结果的其他视图。

此外,您不应将 View 属性保留为 @State

试试这个:

struct ContentView: View {
    
    var body: some View {
        myTextView
    }
    
    var myTextView: some View {
        TextView(stringOfText: "Hello, world!")
            .foregroundColor(Color.red)
    }
}

【讨论】:

  • 是的,正是您指出了正确的事情 func foregroundColor 返回 some View 代码修改发生在 myTextView 中,我希望它发生在body,我的重点是将 TextView 替换为 some View
  • @swiftPunk 我的重点是用一些视图替换 TextView - 然后你可以使用上面建议的var myTextView: some View。还是我还缺少什么?
  • 所以你正在使用 TextView 来制作 myTextView,我认为你正在将 View 转换为 some查看对吗?这就是你找到的方式,我没有任何反对意见,除非你可以看到我最初的问题是关于对我的代码进行某种更正,即 TextView 类型变为 some View,在更正之后,我可以轻松地修改 TextView 类型的值说:给 foregroundColor 然后再次分配给您可以在我的代码中看到的相同值。我的意思是更新我正在尝试学习的值类型 TextView。
  • @swiftPunk 我们不会在这里改变任何东西——这就是重点。任何符合 View 的结构都已经是 some View - 不管你是否想要它:) 首先我建议你阅读Opaque TypesWhat is the some keyword in Swift(UI)?
  • 我在想任何符合 View 的结构已经是某个 View,并且我得到了 xcode 错误 Cannot assign value of typesome View to type TextView 因为 TextView 有 View类型并且正如你所说的符合一些视图,那么它应该只是工作,但没有工作,我已经在关于视图和一些视图的问题中解释了。我认为对于 SwiftUI View 和一些 View 是不同的东西
猜你喜欢
  • 2020-08-03
  • 1970-01-01
  • 2020-03-30
  • 2020-07-15
  • 1970-01-01
  • 1970-01-01
  • 2020-02-17
  • 2020-03-30
  • 1970-01-01
相关资源
最近更新 更多