redacted(reason:) 是什么?#
redacted(reason:) 是 SwiftUI 提供的一个视图修饰符,用于隐藏或模糊内容,通常用于:
- Skeleton Loading(骨架屏):在数据加载前显示灰色占位符。
- 隐藏敏感信息(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)
- 在
List、VStack或HStack里应用redacted(reason: .placeholder),提升加载体验。
✅ 隐藏敏感信息(iOS 15+)
- 例如银行卡号、隐私数据,结合
.privacySensitive让系统决定是否显示内容。
✅ 渐进式数据加载
- 在部分数据可见,部分仍在加载时,使用
.redacted(reason: .placeholder)让 UI 更平滑。
RedactionReasons 总结#
RedactionReasons 是一个 OptionSet,可以组合多个选项:
| 选项 | 作用 | 适用场景 |
|---|---|---|
.placeholder | 将 Text、Image 变为灰色方块 | 加载占位符(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,系统可根据设置自动处理。