SwiftUI:如何仅将修饰符应用于特定元素?

Posted

技术标签:

【中文标题】SwiftUI:如何仅将修饰符应用于特定元素?【英文标题】:SwiftUI: How to apply modifiers only to specific elements? 【发布时间】:2021-02-08 21:56:53 【问题描述】:

所以我有这个非常简化的代码,我基本上有一个带有自定义修饰符的 HStack。

我的问题是,如何将修饰符保留在 HStack 上,但不要让修饰符应用于 HStack 内的按钮?

在这种情况下,我可以直接将修饰符应用于文本字段,但正如我所提到的,这是我的代码的一个非常简化的版本,所以我们假设修饰符必须在 HStack 上

这是代码

HStack
    TextField("Enter a Froot", text: self.$searchTxt)
     
    Button(action: print("Is cancelled"))
        Text("Cancel")
                    
.modifier(TFModifier())

这是修饰符

struct TFModifier : ViewModifier 
    func body(content: Content) -> some View 
        content.padding()
            .background(Color("TesterColor"))
            .overlay(
                RoundedRectangle(cornerRadius: 20)
                    .stroke(Color.black.opacity(0.01), lineWidth: 4)
                    .shadow(color:  Color("TesterColor3"), radius: 6, x: 5, y: 5)
                    .clipShape(RoundedRectangle(cornerRadius: 20))
            )
    

【问题讨论】:

我将您的代码添加到项目中,它似乎按预期工作。 TFModifier 仅在 HStack 上。这里有什么问题? 我不希望修饰符应用于按钮@nicksarno 这能回答你的问题吗? How to apply shadow to interior views in SwiftUI? 【参考方案1】:

在您的情况下,ViewModifier 认为内容是整个 HStack,这实际上是您最近告诉 SwiftUI 将我的 HStack 作为内容并作为内容使用 TFModifier 修改它!在这种情况下,没有办法告诉 SwiftUI 将 Button 排除在计算之外!这是100%不可能的! SwiftUI 不像 TFModifier 那样关心你的命名,它只关心传入的内容!就像我说的那样,您将整个 HStack 作为内容提供! 最好想想你想在哪里敏锐地应用这个修改!

【讨论】:

感谢您的回答,即使我使用自定义修饰符,我还能这样做吗?而且我不希望按钮有不同的修饰符,我希望它根本没有修饰符@swiftPunk

以上是关于SwiftUI:如何仅将修饰符应用于特定元素?的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI-自定义修饰符

为啥修饰符顺序在 SwiftUI 中很重要? [复制]

在 SwiftUI 的自定义视图中访问图像的修饰符

SwiftUI fileExporter 在 DocumentGroup 的工具栏修饰符中用作按钮修饰符时不存在

SwiftUI NavigationView 切换色调颜色

SwiftUI:数组内的修饰符