SwiftUI — redacted

redacted(reason:) 是什么? #

redacted(reason:) 是 SwiftUI 提供的一个视图修饰符,用于隐藏或模糊内容,通常用于:

  1. Skeleton Loading(骨架屏):在数据加载前显示灰色占位符。
  2. 隐藏敏感信息(iOS 15+):如银行卡号、地址、个人信息等,确保隐私安全。

redacted(reason:) 的基本用法 #

redacted(reason:) 需要传入 RedactionReasons,指明隐藏方式。例如:

struct LoadingView: View {
    @State private var isLoading = true

    var body: some View {
        VStack {
            Text("User Name")
            Text("user@example.com")
        }
        .redacted(reason: isLoading ? .placeholder : [])
        .onAppear {
            DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
                isLoading = false
            }
        }
    }
}

📌 效果

  • isLoading = true 时,Text 显示灰色占位条(Skeleton UI)。
  • 3 秒后数据加载完成,视图恢复正常内容。

什么时候使用 redacted(reason:) #

骨架屏(Skeleton UI)

  • ListVStackHStack 里应用 redacted(reason: .placeholder),提升加载体验。

隐藏敏感信息(iOS 15+)

  • 例如银行卡号、隐私数据,结合 .privacySensitive 让系统决定是否显示内容。

渐进式数据加载

  • 部分数据可见,部分仍在加载时,使用 .redacted(reason: .placeholder) 让 UI 更平滑。

RedactionReasons 总结 #

RedactionReasons 是一个 OptionSet,可以组合多个选项:

选项作用适用场景
.placeholderTextImage 变为灰色方块加载占位符(Skeleton UI)
.privacySensitive隐藏敏感信息(iOS 15+)用户隐私数据(如银行信息、地址等)

注意

  • .placeholder 手动控制,主要用于加载状态。
  • .privacySensitive 系统控制,例如 Screen Time 可能自动模糊内容。

移除 redacted 效果 #

如果 redacted(reason:) 作用于整个 VStack,但你希望某些视图仍然可见,可以使用 .unredacted()

struct PartialRedactionView: View {
    var body: some View {
        VStack {
            Text("Title")
                .font(.largeTitle)
                .unredacted() // 这个文本始终可见
            Text("Subtitle")
                .redacted(reason: .placeholder)
        }
    }
}

📌 Title 始终显示,Subtitle 变成灰色占位符。


总结 #

  • redacted(reason:) 用于隐藏或模糊视图内容,常用于加载状态隐私保护
  • RedactionReasons.placeholder(占位符).privacySensitive(敏感信息)
  • .unredacted() 可移除 redacted 效果,让部分视图保持可见。

📌 最佳实践

  • 数据未加载时用 .placeholder,让 UI 更顺滑。
  • 需要隐藏隐私信息时用 .privacySensitive,系统可根据设置自动处理。
本文共 794 字,创建于 Feb 6, 2025
相关标签: SwiftUI