什么是 SwiftUI 中的 EnvironmentalModifier?

3
根据此处的文档,EnvironmentalModifier是指:

在使用之前必须在环境中解析为具体修饰符的修饰符。

这是什么意思?请提供示例。
更新:请注意,该问题不涉及environment视图修饰符,而是涉及用于视图修饰符的协议EnvironmentalModifier(请注意后缀-al)。

4
在这篇文章中搜索"EnvironmentalModifier",你会找到一些遵循SwiftUI EnvironmentKey的自定义修饰符。通过使用环境修饰符,您可以将值传递给子视图的环境中。 - Joakim Danielson
2个回答

1

一个EnvironmentalModifier是一个ViewModifier,它通过使用来自环境的值来决定应该对视图应用什么效果。

以下是一个Playground示例:

import UIKit
import SwiftUI
import PlaygroundSupport

struct ShadowModifier: ViewModifier {
  let whichShadow: ShadowSetting.Value

  func body(content: Content) -> some View {
    switch whichShadow {
    case .none:
      content
    case .blue:
      content
        .shadow(color: .blue, radius: 10)
    case .red:
      content
        .shadow(color: .red, radius: 10)
    }
  }
}

struct ShadowSetting: EnvironmentKey {
  enum Value {
    case none
    case blue
    case red
  }

  static var defaultValue = Value.none
}

extension EnvironmentValues {
  var shadowSetting: ShadowSetting.Value {
    get { self[ShadowSetting.self] }
    set { self[ShadowSetting.self] = newValue }
  }
}

struct OnlyTheShadowKnows: EnvironmentalModifier {
  typealias ResolvedModifier = ShadowModifier

  func resolve(in environment: EnvironmentValues) -> ShadowModifier {
    return ShadowModifier(whichShadow: environment[keyPath: \.shadowSetting])
  }
}


extension View {
  func customModifier() -> some View {
    return self
  }
}

struct MyView : View {
  var body: some View {
    VStack {
      HStack {
        Text("Hello")
          .modifier(OnlyTheShadowKnows())
      }
      .environment(\.shadowSetting, .blue)

      HStack {
        Text("Hello")
          .modifier(OnlyTheShadowKnows())
      }
      .environment(\.shadowSetting, .red)

    }.frame(width: 320, height: 240)
  }
}

let hosted = MyView()
PlaygroundSupport.PlaygroundPage.current.liveView = UIHostingController(rootView: hosted)

在示例中,ShadowModifier 是一个视图修饰符,可以根据其构造方式为视图添加红色阴影或蓝色阴影。 ShadowSetting 是一个自定义环境值,提供阴影颜色的选项。 EnvironmentValues 被扩展以保存一个ShadowSettingOnlyTheShadowKnows 是一个EnvironmentalModifier。它检查当前环境中的ShadowSetting并根据环境的shadowSetting的值来"解析"为正确的ShadowModiferMyView 在其环境中具有两个具有不同shadowSettings的小视图层次结构。每个Text标签应用了OnlyTheShadowKnows修饰符,并解析为正确的阴影。
最后一部分将MyView放在屏幕上。

-1

一个环境修改器是在视图上调用的一个方法,用于修改该视图环境中的值。然后,所有子视图都可以使用被修改的值。

请参见此处的讨论以获取示例:

https://developer.apple.com/documentation/swiftui/view/environment(_:_:)

在这个例子中,使用@Environment声明将名为truncationMode的环境属性添加到视图的环境中。
@Environment(\.truncationMode) var truncationMode: Text.TruncationMode

当视图被实例化时,使用环境修饰符来建立此环境属性的值:

MyView()
    .environment(\.truncationMode, .head)

环境修饰符 .environment(\.truncationMode, .head) 解析为由 @Environment 声明的具体属性 truncationMode


这是对环境视图修饰符的很好描述,所以谢谢你。然而,问题是关于EnvironmentalModifiers(注意-al后缀)以及它们的作用。我会在备注中加上说明。 - atineoSE

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